點燈坊

失くすものさえない今が強くなるチャンスよ

使用 reverse() 將 Array 顛倒

Sam Xiao's Avatar 2019-07-19

將 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 結束執行。

reverse000

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() 改寫之。

reverse002

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。

reverse004

Array.prototype.reverse()

let data = [1, 2, 3];

// reverse :: [a] -> [a]
let reverse = arr => arr.reverse();

reverse(data); // ?

Array.prototype 已經內建 reverse(),可直接使用。

reverse001

Ramda

import { reverse } from 'ramda';

let data = [1, 2, 3];

reverse(data); // ?

事實上 Ramda 也提供 reverse(),可直接使用。

reverse()
[a] -> [a]
將 array 顛倒

reverse003

Conclusion

  • reverse() 除了用在 array 外,也能用在 string

Reference

Ramda, reverse()