點燈坊

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

使用 pick() 擷取 Object 部分 Property

Sam Xiao's Avatar 2019-08-02

實務上 map() 最常使用的就是從 Object 眾多 Property 中,僅擷取部分 Property,Ramda 提供了 pick() 達成此功能。

Version

macOS 10.14.5
VS Code 1.36.1
Quokka 1.0.238
Ramda 0.26.1

Imperative

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

let usrFn = arr => {
  let result = [];

  for(let x of arr)
    result.push({ title: x.title });

  return result;
};

console.dir(usrFn(data));

Imperative 會使用 for loop,先建立新的 result array,只將 title push 進 result 回傳。

pick002

Array.prototype.map()

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

let usrFn = arr => arr.map(x => ({ title: x.title }));

console.dir(usrFn(data));

ECMAScript 的 Array.prototype 也內建 map(),可直接使用 arrow function 傳入 map function。

pick000

Ramda

import { map, pick } from 'ramda';

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

let usrFn = map(pick(['title']));

console.dir(usrFn(data));

若想要 map function 也 point-free,可在搭配 pick(),將 property 以 array 傳入即可。

pick()
[k] -> {k: v} -> {k: v}
從一個 object 中抽取部分 property 成為新 object

[k]:要抽取的 property

{k: v}:data 為 object

{k: v} : 回傳新的 object

pick001

Conclusion

  • pick() 使得 map() 的 callback 更為精簡,這就是 point-free 的魔力

Reference

Ramda, map()
Ramda, pick()