Underscore.js _.reduce()返回对象

时间:2016-06-24 16:59:02

标签: javascript object underscore.js reduce

我试图创建一个列表,列出了多少商店从一系列商店中携带一个给定商品。 stores数组中的单个对象可以包含一堆不同的属性(名称,位置等),但我只是想要挑选出库存(他们携带的一系列项目类型,而不是实际库存号 - 看起来像['hammers', 'wrenches', 'screw drivers'),并创建一个对象,每个项目都是包含计数的属性。

//simplified stores array for reference
stores = [
       { name: "Al's Hardware", inventory: ['hammers', 'wrenches'] },
       { name: "House Depot", inventory: ['wrenches', 'hammers', 'screw drivers'] },
       { name: "Grove Hardware", inventory: ['wrenches', 'screw drivers'] }
];

var itemCount = _(stores).chain()
   .map(store => store.inventory)
   .flatten()
   .reduce((list, item) => list[item] = (list[item] || 0) + 1, {})
   .value();

console.log(itemCount['hammers']); //Expected: 2; Actual: undefined
console.log(itemCount); //Expected: object containing all names and values; Actual: 1

还不确定我做错了什么,但我猜它与我尝试使用_.reduce()的方式有关。但是,在这一点上,我有点迷失,所以我不确定下一步该尝试什么。

我确定这是我想要的结构(我不是在寻找解决方法),我只是好奇我正在做什么来减少明显的破坏,以及如何改变它才能正常工作,以便它能给我一些看起来像

的东西
{'hammers': 2,
'wrenches': 3,
'screw drivers': 2}

1 个答案:

答案 0 :(得分:1)

.reduce的回调应该返回initialValue即空对象,如果你不使用箭头功能你所做的就像

.reduce(function (list, item) {
  return list[item] = (list[item] || 0) + 1
}, {})

应该是

.reduce(function (list, item) {
  list[item] = (list[item] || 0) + 1
  return list
}, {})

如果你想要一个衬垫,你可以使用

.reduce((list, item) => (list[item] = (list[item] || 0) + 1, list), {})

实施例

console.log(['a', 'a', 'b', 'c'].reduce((list, item) => (list[item] = (list[item] || 0) + 1, list), {}))