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

标签 javascript arrays unique average

我有一个这样的数组:

var array = [
     {
       name: "a",
       value: 1 
     },
     {
       name: "a",
       value: 2 
     },
     {
       name: "a",
       value: 3 
     },
     {
       name: "b",
       value: 0 
     },
     {
       name: "b",
       value: 1 
     }
 ];

我需要这样的数组:

var newarray = [
     {
       name: "a",
       value: 2
     },
     {
       name: "b",
       value: 0.5
     }
 ]

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

有没有简单的方法可以做到这一点?

最佳答案

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

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;
}

Demonstration

请注意,如果您使用像 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();

Demonstration

关于javascript - 汇总对象数组并计算每个唯一对象名称的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21819819/

相关文章:

javascript - 如何使用关闭按钮创建此多个动态 id 特定的 Accordion ?

javascript - switch operator 如何取消订阅之前的 observables?

javascript - js : loop through array indefinetly

javascript - JS 将内联 css 添加到 html

javascript - 将对象添加到 javascript 数组,其中列表指定类型

javascript - 下划线递归 groupBy 字符串数组数组

java - 如何解析JSON数组对象textview 1和textview 2

java - 如何为给定的字符串创建唯一的序列号?

MySQL SELECT 列,其中两列都是唯一的

excel - 从列表中提取唯一值并在 Excel 中按出现次数排序