如何从这个数组获取
[
{name: "a", weight: 1},
{name: "b", weight: 3},
{name: "a", weight: 5},
{name: "b", weight: 7}
]
得到这个阵列(求和重复的重量)
[
{name: "a", weight: 6},
{name: "b", weight: 10}
]
如何从这个数组获取
[
{name: "a", weight: 1},
{name: "b", weight: 3},
{name: "a", weight: 5},
{name: "b", weight: 7}
]
得到这个阵列(求和重复的重量)
[
{name: "a", weight: 6},
{name: "b", weight: 10}
]
这样的事情应该工作中使用groupBy
reduce
和pluck
:
var sum = function(a,b){ return a+b; };
_.chain([
{name: "a", weight: 1},
{name: "b", weight: 3},
{name: "a", weight: 5},
{name: "b", weight: 7}
]).groupBy('name') // we first group them by name
.map(function(v){ // them we map group to the name, and the sum of weights
return {name:v[0].name,weight:_.pluck(v,"weight").reduce(sum)};
}).value(); // finally, we get the value
请注意,我们reduce
使用原生的JavaScript降低,如果你想下划线的减少你的前内需要链ING _.pluck
,打电话.reduce
,然后调用.value
。
你不需要任何花哨的东西,下划线为这一点,你可以用一个做这一切reduce
呼叫:
var result = a.reduce(function(m, e) {
if(!m.by_name[e.name]) {
m.by_name[e.name] = { name: e.name, weight: 0 };
m.a.push(m.by_name[e.name]);
}
m.by_name[e.name].weight += e.weight;
return m;
}, { a: [ ], by_name: { } });
那么你的阵列将处于result.a
。
演示: http://jsfiddle.net/ambiguous/6UaXr/
如果你一定要,你可以使用_.reduce
,而不是本机的reduce
。
这里有几个技巧:
reduce
备忘录缓存按名称的结果中的物体和在同一时间的阵列。 在索引由m.by_name
让您快速查找,但你想要一个数组作为最终结果,所以我们建立一路走来了。 m.by_name[e.name]
还更新阵列。 by_name
项创建(引用仔细共享)在第一时间,我们需要他们。 因此,所有的总结在单个完毕后,我们还与零初始化缓存的权重m.by_name[e.name].weight += e.weight
。