點燈坊

學而時習之,不亦悅乎

使用 remove() 指定 Array 中不要的部分

Sam Xiao's Avatar 2019-07-07

若要從 Array 擷取其中一部分,但我們無法如 slice() 指定要的部分,只能指定不要的部分,此時我們可使用 Ramda 的 remove()

Version

macOS Mojave 10.14.5
VS Code 1.33.1
Quokka 1.0.210
Ramda 0.26.1

Functional

import { slice, without } from 'ramda';

let data = [1, 2, 3, 4, 5];

// remove :: Number -> Number -> [a] -> [a]
let remove = begin => cnt => arr => without(slice(begin, begin + cnt, arr), arr);

remove(1)(3)(data); // ?

假如我們一開始不知道 Ramda 的 remove(),也可透過 slice()without() 組合:

  • 先使用 slice() 找出不要的部分
  • 再使用 without() 排除不要的部分

remove000

Point-free

import { slice, without, chain } from 'ramda';

let data = [1, 2, 3, 4, 5];

// remove :: Number -> Number -> [a] -> [a]
let remove = begin => cnt => chain(
  without,
  slice(begin, begin + cnt)
);

remove(1)(3)(data); // ?

也可以進一步 point-free,使用 chain()without()slice() 整合起來,一目瞭然。

remove001

Ramda

import { remove } from 'ramda';

let data = [1, 2, 3, 4, 5];

remove(1)(3)(data); // ?

事實上 Ramda 已經內建 remove(),可直接使用。

remove()
Number → Number → [a] → [a]

直接指定 Array 中不要的部分擷取部分 Array

Number:Array 的 start index

Number:Array 的 element count

[a]:Data 為 array

[a]:回傳所截取的 array

remove002

Object

import { remove } from 'ramda';

let data = [
  { firstName: 'Sam',    lastName: 'Xiao'},
  { firstName: 'Kevin',  lastName: 'Yang'},
  { firstName: 'Jimmy',  lastName: 'Huang'},
  { firstName: 'Jessie', lastName: 'Hsieh'},
  { firstName: 'John',   lastName: 'Wu'}
];

console.dir(remove(1)(3)(data));

若 element 為 object,remove() 依然適用。

remove001

Conclusion

  • remove() 是與 slice() 相對的 function:slice() 是指定要的部分,而 remove() 是指定不要的部分

Reference

Ramda, remove()
Ramda, slice()
Ramda, without()