最近我发现自己在应用程序中越来越多地使用关联数组(或哈希表)(优点是查找速度、重复删除等)。
这是从我的应用程序中获取的典型代码 -
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/