若只想取 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
結束執行。
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()
將前幾筆資料刪除。
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()
整合所有流程,非常清楚。
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。
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 筆資料
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。
Conclusion
takeLast()
也可使用drop()
與take()
實現takeLast()
不只用在 array,也可以用於 string