點燈坊

學而時習之,不亦悅乎

使用 takeLast() 取得 Array 最後幾筆資料

Sam Xiao's Avatar 2019-07-16

若只想取 Array 的後幾筆資料,Ramda 提供了 takeLast()

Version

macOS Mojave 10.14.5
VS Code 1.36.1
Quokka 1.0.233
Ramda 0.26.1

Imperative

let data = [1, 2, 3];

// takeLast :: Number -> [a] -> [a]
let takeLast = cnt => arr => {
  let result = [];
  let index = 0;
  let threshold = arr.length - cnt;

  for(let elem of arr) {
    if (index >= threshold) {
      result = [...result, elem];
    }
    index++;
  }

  return result;
};

takeLast(2)(data); // ?

建立 take(),imperative 會使用 for loop,並先建立好回傳的 result array,當 i 小於 threshold 時,elm 會塞進回 result,最後回傳 result 結束執行。

takelast000

Functional

import { drop, length } from 'ramda';

let data = [1, 2, 3];

// takeLast :: Number -> [a] -> [a]
let takeLast = cnt => arr => drop(length(arr) - cnt)(arr);

takeLast(2)(data); // ?

由於只回傳最後幾筆資料,相當於先用 drop() 將前幾筆資料刪除。

takelast001

import { pipe, reverse, take } from 'ramda';

let data = [1, 2, 3];

// takeLast :: Number -> [a] -> [a]
let takeLast = cnt => pipe(
  reverse,
  take(cnt),
  reverse
);

takeLast(2)(data); // ?

也可使用 take() 實作 takeLast()

  • 使用 reverse() 先將 array 反轉
  • 使用 take() 取得前幾筆資料
  • 再使用 reverse() 將 array 反轉

最後以 pipe() 整合所有流程,非常清楚。

takelast002

Point-free

import { pipe, reverse, take, curry, useWith, identity } from 'ramda';

let data = [1, 2, 3];

// takeLast :: Number -> [a] -> [a]
let takeLast = curry(pipe(
  useWith(take, [identity, reverse]),
  reverse
));

takeLast(2)(data); // ?

也可以使用 useWith() 進一步 point-free。

takelast003

Ramda

import { takeLast } from 'ramda';

let data = [1, 2, 3];

takeLast(2)(data); // ?

Ramd 已經內建 takeLast(),可直接使用。

takeLast()
Number -> [a] -> [a]
取得 array 中最後 n 筆資料

Number:最後 n 筆

[a]:data 為 array

[a]:回傳最後 n 筆資料

takelast004

Object

import { takeLast } from 'ramda';

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
];

console.dir(takeLast(2)(data));

takeLast() 也可用在 object。

takelast005

Conclusion

  • takeLast() 也可使用 drop()take() 實現
  • takeLast() 不只用在 array,也可以用於 string

Reference

Ramda, takeLast()
Ramda, drop()
Ramda, take()