我怎样才能通过总结他们与lodash第二个值减少与非唯一元素阵列/下划线?(How can I re

2019-10-20 06:21发布

如何从这个数组获取

[
    {name: "a", weight: 1}, 
    {name: "b", weight: 3}, 
    {name: "a", weight: 5},
    {name: "b", weight: 7}
]

得到这个阵列(求和重复的重量)

[
    {name: "a", weight: 6}, 
    {name: "b", weight: 10}
]

Answer 1:

这样的事情应该工作中使用groupBy reducepluck

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



Answer 2:

你不需要任何花哨的东西,下划线为这一点,你可以用一个做这一切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

这里有几个技巧:

  1. reduce备忘录缓存按名称的结果中的物体和在同一时间的阵列。 在索引由m.by_name让您快速查找,但你想要一个数组作为最终结果,所以我们建立一路走来了。
  2. 的按姓名对象和阵列共享相同的引用,以便递增通过m.by_name[e.name]还更新阵列。
  3. by_name项创建(引用仔细共享)在第一时间,我们需要他们。 因此,所有的总结在单个完毕后,我们还与零初始化缓存的权重m.by_name[e.name].weight += e.weight


文章来源: How can I reduce array with non-unique elements by summing their second value with lodash/underscore?