javascript - 使用 Ramba、下划线或纯 Javascript 构建关联数组的最佳方法?

标签 javascript underscore.js ramda.js

最近我发现自己在应用程序中越来越多地使用关联数组(或哈希表)(优点是查找速度、重复删除等)。

这是从我的应用程序中获取的典型代码 -

 var parent1 = { id: 5, name: 'parent 1'}, parent2  = { id: 10, name: 'parent 2'};
 var children = [{id: 1, parent: parent1}, {id: 2, parent: parent1}, {id: 3, parent: parent1}, {id: 4, parent: parent2}]

var addToHash = function (hashObj, child) {
    var parent = child.parent;
    hashObj[parent.id] = parent;
    return hashObj;
};

var uniqueParents = R.reduce(addToHash, {}, children);

目前我使用 Ramda reduce 函数。

问题 - 是否有更好(更简洁)的方法来使用 Ramda、另一个第 3 方库或简单地使用普通 Javascript 来实现此目的?

最佳答案

一种可能性:

R.pipe(
  R.map(prop('parent')),                //=> [parent1, parent1, parent1, parent2]
  R.uniq,                               //=> [parent1, parent2]
  R.map(parent => [parent.id, parent]), //=> [[5, parent1], [10, parent1]]
  R.fromPairs                           //=> {5: parent1, 10: parent2}
)(children); 
//=> {5: {id: 5, name: 'parent 1', 10: {id: 10, name: 'parent 2'}}}

请注意,如果您只想要 uniq 父级列表而不是 HashMap ,则可以在管道中的第二个函数之后停止。

另一个选项与您的类似,它只是将您的函数转换为返回新累加器而不是对其进行变异的函数:

var parentMap = R.reduce((acc, child) => R.assoc(child.parent.id, child.parent, acc), {});
parentMap(children); //=> {5: {id: 5, name: 'parent 1', 10: {id: 10, name: 'parent 2'}}}

关于javascript - 使用 Ramba、下划线或纯 Javascript 构建关联数组的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35704267/

相关文章:

javascript - 将逗号分隔字符串数组转换为对象数组

javascript - 单击 1 次后禁用 onclick()

jquery - Backbone 在应用程序中插入应用程序

underscore.js - Lodash 和 Underscore.js 的区别

javascript - 一次更新设置多个 Ramda 镜头

javascript - 将对象从数组 A 移动到数组 B. Ramda.js

javascript - getElementByID().parentNode 返回 null

javascript - 要在 View 中使用的值中的响应数据 (AngularJS)

javascript - 如何使用 lodash 或下划线删除两个数组中的同一个对象?

javascript - 在管道中重用变量的功能方法