如何使用javascript对属性上的数组进行分组以在特定键处获得每个组的聚合值?
Posted
技术标签:
【中文标题】如何使用javascript对属性上的数组进行分组以在特定键处获得每个组的聚合值?【英文标题】:How to group an array on an attribute to attain each groups aggregate value at a specific key using javascript? 【发布时间】:2016-08-09 13:44:31 【问题描述】:我想用下面的数组识别“fruit”的所有唯一值,并识别这些水果的相应计数。
例如,在下面的数组中,我们知道有 3 个水果(苹果、香蕉和樱桃),我们有 2 个苹果、10 个香蕉和 5 个樱桃。
var input_data = ["count":1,"fruit":"apple","count":1,"fruit":"apple","count":10,"fruit":"banana","count":5,"fruit":"cherry"]
基于以上输入,我想实现以下输出:
desired_output_1 = ['apple','banana','cherry']
desired_output_2 = [2,10,5]
我能够通过 underscore.js 中使用的以下函数获得desired_output_1,但我不确定如何获得desired_output_2。
_.uniq(_.pluck(input_data,'fruit'))
因此,我真的很想根据上面的计数来获得 [2,10,5] 的方法。
【问题讨论】:
【参考方案1】:var data = [
"count": 1,
"fruit": "apple"
,
"count": 1,
"fruit": "apple"
,
"count": 10,
"fruit": "banana"
,
"count": 5,
"fruit": "cherry"
];
var fruits = [];
var counts = [];
for (var i in data)
var index = fruits.indexOf(data[i].fruit);
if (index == -1)
fruits.push(data[i].fruit)
counts.push(data[i].count);
else
counts[index] = counts[index] + data[i].count;
console.log(fruits , counts);
【讨论】:
【参考方案2】:你可能不需要下划线/lodash :)
var input_data = [
"count":1,"fruit":"apple",
"count":1,"fruit":"apple",
"count":10,"fruit":"banana",
"count":5,"fruit":"cherry"
];
var result = input_data.reduce(function ( acc, current )
if( !acc[current.fruit] )
acc[current.fruit] = 0;
acc[current.fruit] += current.count;
return acc;
, );
console.log(result);
输出是一个对象而不是两个数组。这将保持水果 计数关系。
【讨论】:
【参考方案3】:var input_data = ["count":1,"fruit":"apple","count":1,"fruit":"apple","count":10,"fruit":"banana","count":5,"fruit":"cherry"];
var fruits = [];
var counts = [];
for (var i in input_data)
var index = fruits.indexOf(input_data[i].fruit);
if (index == -1)
fruits.push(input_data[i].fruit)
counts.push(input_data[i].count);
else
counts[index] += input_data[i].count;
console.log(fruits, counts);
【讨论】:
以上是关于如何使用javascript对属性上的数组进行分组以在特定键处获得每个组的聚合值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 reduce 函数 javascript 对对象进行分组
如何在reactjs / javascript中按值对对象数组进行分组