我有一个像这样的数组:
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;
}
请注意,如果您使用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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句