汇总对象数组并计算每个唯一对象名称的平均值

use*_*337 5 javascript arrays average unique

我有一个像这样的数组:

var array = [
     {
       name: "a",
       value: 1 
     },
     {
       name: "a",
       value: 2 
     },
     {
       name: "a",
       value: 3 
     },
     {
       name: "b",
       value: 0 
     },
     {
       name: "b",
       value: 1 
     }
 ];
Run Code Online (Sandbox Code Playgroud)

我需要一个像这样的数组:

var newarray = [
     {
       name: "a",
       value: 2
     },
     {
       name: "b",
       value: 0.5
     }
 ]
Run Code Online (Sandbox Code Playgroud)

新数组具有每个唯一名称作为具有平均值的对象.

有没有一种简单的方法来实现这一目标?

p.s*_*w.g 6

你必须遍历数组,计算每个对象的总和和计数.这是一个快速实现:

function average(arr) {
    var sums = {}, counts = {}, results = [], name;
    for (var i = 0; i < arr.length; i++) {
        name = arr[i].name;
        if (!(name in sums)) {
            sums[name] = 0;
            counts[name] = 0;
        }
        sums[name] += arr[i].value;
        counts[name]++;
    }

    for(name in sums) {
        results.push({ name: name, value: sums[name] / counts[name] });
    }
    return results;
}
Run Code Online (Sandbox Code Playgroud)

示范

请注意,如果您使用像Underscore.js这样的库,这种事情会变得更容易:

var averages = _.chain(array)
                .groupBy('name')
                .map(function(g, k) {
                    return { 
                        name: k, 
                        value: _.chain(g)
                                .pluck('value')
                                .reduce(function(x, y) { return x + y })
                                .value() / g.length
                    };
                })
                .value();
Run Code Online (Sandbox Code Playgroud)

示范

  • 我不知道下划线版本“容易得多”。它需要理解 *chain*、*groupBy*、*map*、*pluck*、*value* 和 *reduce* 并且需要一个合适的 *reduce* 函数。我敢打赌它也比 POJS 版本慢很多(后者可以更简洁)。;-) (2认同)