Ramda Cookbook 之 pickIndexes()
栏目: JavaScript · 发布时间: 5年前
内容简介:若我們想從 Array 得到幾個特定 Index 的 Element 時,該如何實現呢 ?VS Code 1.33.0
Ramda Cookbook 是學習 Ramda 很好的地方,除了都是很實用的 function 外,還可以學到更進階的 Ramda 技巧。
若我們想從 Array 得到幾個特定 Index 的 Element 時,該如何實現呢 ?
Version
VS Code 1.33.0
Quokka 1.0.205
Ramda 0.26.1
pickIndexes()
import { compose, values, pickAll } from 'ramda'; let data = [ { title: 'FP in JavaScript', price: 100 }, { title: 'RxJS in Action', price: 200 }, { title: 'Speaking JavaScript', price: 300 } ]; let pickIndexes = compose(values, pickAll); console.dir(pickIndexes([0, 2], data));
我們只想得到 array 的第 0 筆與第 2 筆,因此傳進 [0, 2]
給 pickIndexes()
,只要組合 values()
與 pickAll()
即可。
pickAll()
[k] -> {k: v} -> {k: v}
與 pick()
功能相同,唯若 property 不存在,則顯示 undefined
pickAll()
的第二個參數明明是 object,為什麼傳入 array 也可以呢 ? 難道 Ramda 官網寫錯了 ?
import _curry2 from './internal/_curry2'; var pickAll = _curry2(function pickAll(names, obj) { var result = {}; var idx = 0; var len = names.length; while (idx < len) { var name = names[idx]; result[name] = obj[name]; idx += 1; } return result; }); export default pickAll;
若去研究 pickAll() 的 source code,會發現一個很有趣的地方。
第 9 行
result[name] = obj[name];
obj[name]
的 obj
若是 object,則相當於 obj.name
;若 obj
是 array, name
為 index,則相當於取出該 index 的 element。
因為 ECMAScript 的 array 與 object 都共用 []
語法,根據這個特殊的語言特性,原作者借用 pickAll()
傳入 index 的 array,回傳只有指定的 index 的 object,然後再使用 values()
轉成 array。
import { compose, values, pickAll } from 'ramda'; let data = { 0: { title: 'FP in JavaScript', price: 100 }, 1: { title: 'RxJS in Action', price: 200 }, 2: { title: 'Speaking JavaScript', price: 300 } }; let pickIndexes = compose(values, pickAll); console.dir(pickIndexes([0, 2], data));
或者從另外一個角度,將 array 改用 object 表示,property 的 key 就是 index,如此就符合 pickAll()
的要求,data 是 object,會發現 pickIndexes()
結果不變。
Conclusion
- 因為 object 與 array 都共用
[]
,使得原本該傳入 object 的 function,也可以傳入 array,也因為 ECMAScript 的 dynamic language 特性,這使得pickAll()
出現 Ramda 官方文件沒寫的用法 - 從另外一個角度,array 其實也是另外一個形式的 object,其 key 為 index,value 則是 array 的 element
Reference
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。