Ramda Cookbook 之 pickIndexes()

栏目: JavaScript · 发布时间: 7年前

内容简介:若我們想從 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() 即可。

Ramda Cookbook 之 pickIndexes()

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() 結果不變。

Ramda Cookbook 之 pickIndexes()

Conclusion

  • 因為 object 與 array 都共用 [] ,使得原本該傳入 object 的 function,也可以傳入 array,也因為 ECMAScript 的 dynamic language 特性,這使得 pickAll() 出現 Ramda 官方文件沒寫的用法
  • 從另外一個角度,array 其實也是另外一個形式的 object,其 key 為 index,value 則是 array 的 element

Reference

Ramda Cookbook , pickIndexes()

ramda/ramda , pickAll()

Ramda , pickAll()

Ramda , values()


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

推荐系统

推荐系统

[奥地利] Dietmar Jannach、Markus Zanker、Alexander Felfernig、Gerhard Friedrich / 蒋 凡 / 人民邮电出版社 / 2013-6-25 / 59.00元

编辑推荐: 通过对本书的学习,读者不仅可以全面系统地了解该领域的基础原理,还能试验如何搭建一套真正的推荐系统。 —— 百度主任架构师、百度技术委员会主席 廖若雪 本书比较全面地介绍了推荐系统涉及的相关知识点,很适合对于推荐系统感兴趣的相关人员作为入门教程,目前能够系统全面介绍相关技术的中文书籍还显得匮乏,相信这本译著对于缓解这种情况大有裨益。 ——新浪微博数据挖掘技术专家 ......一起来看看 《推荐系统》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具