如何使用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中按值对对象数组进行分组

如何使用 knockout.js 数据绑定对数组进行分组和读取:使用

基于变量 javascript 对数组项进行分组

我们如何在 AWS Neptune 上的 RDF 图中对对象进行分组并为组分配通用颜色?