將 Array 前後顛倒在實務上可能不太常見,不過用來練功倒是不錯,有多種實現方式。
Version
macOS Mojave 10.14.5
VS Code 1.36.1
Quokka 1.0.236
Ramda 0.26.1
Imperative
let data = [1, 2, 3];
// reverse :: [a] -> [a]
let reverse = arr => {
let result = '';
for (let elm of arr) {
result = [elm, ...result];
}
return result;
};
reverse(data); // ?
建立 reverse()
,imperative 會使用 for
loop,並先建立好回傳的 result
array,由於要 reverse,因此為 result = [elm, ...result]
,最後會回傳 result
結束執行。
Array.prototype.reduce()
let data = [1, 2, 3];
// reverse :: [a] -> [a]
let reverse = arr => arr.reduce((acc, elm) => [elm, ...acc], []);
reverse(data); // ?
既然能使用 for
loop 實現,就能使用 reduce()
改寫之。
Functional
import { reduce } from 'ramda';
let data = [1, 2, 3];
// reverse :: [a] -> [a]
let reverse = reduce((acc, elm) => [elm, ...acc], []);
reverse(data); // ?
Ramda 的 reduce()
由於 data 在最後一個 argument,可以使 reverse()
point-free。
Array.prototype.reverse()
let data = [1, 2, 3];
// reverse :: [a] -> [a]
let reverse = arr => arr.reverse();
reverse(data); // ?
Array.prototype
已經內建 reverse()
,可直接使用。
Ramda
import { reverse } from 'ramda';
let data = [1, 2, 3];
reverse(data); // ?
事實上 Ramda 也提供 reverse()
,可直接使用。
reverse()
[a] -> [a]
將 array 顛倒
Conclusion
reverse()
除了用在 array 外,也能用在 string