使用多个分组查找散列数组的平均值 [英] Find average value for array of hashes using multiple group by

查看:148
本文介绍了使用多个分组查找散列数组的平均值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基于总结对象数组并计算每个唯一对象名称的平均值我可以部分解决我的问题。我按 ed_id 进行了分组,但是我需要按 ed_id ,然后 el_id 进行分组,并根据这些分组获得平均值,所以这里是我的哈希数组:

  a = [
{
ed_id:1,
el_id :127,
值:2
},
{
ed_id:1,
el_id:127,
值:6
},
{
ed_id:1,
el_id:129,
value:3
},
{
ed_id:1,
el_id:129,
值:13
},
{
ed_id:2,
el_id:127,
值:5
},
{
ed_id:2,
el_id:127,
value:9
},
{
ed_id:2,
el_id:129,
value:10
}
]



因此,最终的哈希数组需要如下所示:

  b = [
{
ed_id :1,
el_id:127,
value:4
},
{
ed_id:1,
el_id:129,
value :8
},
{
ed_id:2,
el_id:127,
值:7
},
{
ed_id:2,
el_id:129,
value:10
}
]

谢谢!

解决方案

使用的方法/函数:

Array.prototype.reduce(callback [,initialValue]) reduce()方法针对累加器和数组的每个值应用一个函数(从左到右 - 右键)将其降低到单个值。



Object.prototype.keys(obj) Object.keys ()方法以与for ... in循环提供的顺序相同的顺序返回一个给定对象自己可枚举属性的数组(不同之处在于for-in循环枚举了原型链中的属性)。



var data = [{ed_id:1,el_id:127,value:2},{ed_id:1,el_id:127,value:6},{ed_id:1,el_id:129,value:3},{ed_id: 1,el_id:129,value:13},{ed_id:2,el_id:127,value:5},{ed_id:2,el_id:127,value:9},{ed_id:2,el_id:129,value: 10}] //将数据组groupvarData = data.reduce(function(l,r){//从我们想要通过var key = r.ed_id +|+ r.el_id分组的属性构造一个唯一键; //检查密钥是否已知if(typeof l [key] ===undefined){// init带有空对象l [key] = {sum:0,count:0}; } //总结这些值并计算出现次数l [key] .sum + = r.value; l [key] .count + = 1;返回l;},{}); console.log(JSON.stringify(groupedData)); // {1 | 127:{sum:8,count:2},1 | 129: { 和:16, 计数:2}, 2 | 127:{ 和:14, 计数:2}, 2 | 129:{ 和:10, 计数 :1}} //计算averagesvar avgGroupedData = Object.keys(groupedData)//遍历< grouppedData>中的元素并将它们转换为旧格式.map(function(key){//分离构造的键以获得零件var keyParts = key.split(/ \ | /); //构造旧格式,包括平均值返回{ed_id:parseInt(keyParts [0],10),el_id:parseInt(keyParts [1],10),value:(grouppedData [key] .sum / groupedData [key] .count)};}) ; console.log(JSON.stringify(avgGroupedData)); // [{ed_id:1,el_id:127,value:4},{ed_id:1,el_id:129,值 :8},{ ed_id :2,el_id :127, 值 :7},{ ed_id :2,el_id :129, 值:10}]


based on Summarize array of objects and calculate average value for each unique object name I could partially solve my problem. I did group by ed_id but I need to group by ed_id and then el_id and to get average value based on those group by, so here is my array of hashes:

a = [
{
 ed_id: 1,
 el_id: 127,
 value: 2
},
{
 ed_id: 1,
 el_id: 127,
 value: 6
},
{
 ed_id: 1,
 el_id: 129,
 value: 3
},
{
 ed_id: 1,
 el_id: 129,
 value: 13
},
{
 ed_id: 2,
 el_id: 127,
 value: 5
},
{
 ed_id: 2,
 el_id: 127,
 value: 9
},
{
 ed_id: 2,
 el_id: 129,
 value: 10
 }
]

So final array of hashes needs to look like:

b = [
{
 ed_id: 1,
 el_id: 127,
 value: 4
},
{
 ed_id: 1,
 el_id: 129,
 value: 8
},
{
 ed_id: 2,
 el_id: 127,
 value: 7
},
{
 ed_id: 2,
 el_id: 129,
 value: 10
 }
]

Thank you!

解决方案

Methods/Functions used:

Array.prototype.reduce(callback[, initialValue]): The reduce() method applies a function against an accumulator and each value of the array (from left-to-right) to reduce it to a single value.

Object.prototype.keys(obj): The Object.keys() method returns an array of a given object's own enumerable properties, in the same order as that provided by a for...in loop (the difference being that a for-in loop enumerates properties in the prototype chain as well).

var data = [
  { ed_id: 1, el_id: 127, value: 2  },
  { ed_id: 1, el_id: 127, value: 6  },
  { ed_id: 1, el_id: 129, value: 3  },
  { ed_id: 1, el_id: 129, value: 13 },
  { ed_id: 2, el_id: 127, value: 5  },
  { ed_id: 2, el_id: 127, value: 9  },
  { ed_id: 2, el_id: 129, value: 10 }
]


// group the data
var groupedData = data.reduce(function(l, r) {
  // construct a unique key out of the properties we want to group by
  var key = r.ed_id + "|" + r.el_id;

  // check if the key is already known
  if (typeof l[key] === "undefined") {
    // init with an "empty" object
    l[key] = {
      sum: 0,
      count: 0
    };
  }
  
  // sum up the values and count the occurences
  l[key].sum += r.value;
  l[key].count += 1;

  return l;
}, {});

console.log(JSON.stringify(groupedData));
//{"1|127":{"sum":8,"count":2},"1|129":{"sum":16,"count":2},"2|127":{"sum":14,"count":2},"2|129":{"sum":10,"count":1}}


// calculate the averages
var avgGroupedData = Object.keys(groupedData)
  // iterate over the elements in <groupedData> and transform them into the "old" format
  .map(function(key) {
    // split the constructed key to get the parts
    var keyParts = key.split(/\|/);

    // construct the "old" format including the average value
    return {
      ed_id: parseInt(keyParts[0], 10),
      el_id: parseInt(keyParts[1], 10),
      value: (groupedData[key].sum / groupedData[key].count)
    };
  });

console.log(JSON.stringify(avgGroupedData));
// [{"ed_id":1,"el_id":127,"value":4},{"ed_id":1,"el_id":129,"value":8},{"ed_id":2,"el_id":127,"value":7},{"ed_id":2,"el_id":129,"value":10}]

这篇关于使用多个分组查找散列数组的平均值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆