使用对象数组中相同键的平均值创建新数组

时间:2020-07-17 10:47:58

标签: javascript arrays average

我有一个对象数组,如下所示:

TurnContext

它们将是N个对象,带有任意组合键jan和feb只是一个例子。

我需要找到具有相似键的对象的平均值,以使结果数组如下所示:

ConversationRefrence

希望在不使用JavaScript的reduce方法的情况下实现这一目标。

我试图用相似的键分离出对象,以便对ic求和并求平均值,然后推入新的射线。像这样的东西:

var arr=[ {"jan":2},{"jan":5},{"feb":3},{"feb":1}];

但是它会在控制台中为相同的键创建多个组。

var newArr=[{"jan":3.5},{"feb":2}];

2 个答案:

答案 0 :(得分:1)

不使用reduce的代码。虽然有点长但是很容易理解 我们使用两个对象,一个用于存储键的数量,另一个用于存储键的总数。 结果对象具有平均值。

var arr=[ {"jan":2},{"jan":5},{"feb":3},{"feb":1}];

var count = {};
var total = {};


arr.forEach(obj => {
    var key = Object.keys(obj)[0];
    if(count.hasOwnProperty(key)){
        count[key]=count[key]+1;
    } else {
        count[key]=1;
    }
    if(total.hasOwnProperty(key)){
        total[key]=total[key]+obj[key];
    } else {
        total[key]=obj[key];
    }

})

var result = {}


Object.keys(total).forEach(key => {
    result[key] = total[key]/count[key];
})

console.log(result)

答案 1 :(得分:1)

类似于上面的答案,但是使用了地图:

var arr=[ {"jan":2},{"jan":5},{"feb":3},{"feb":1}];
let map = new Map();
let keyCount = {};

arr.forEach(e => {
  let key = Object.keys(e)[0];
  let value = Object.values(e)[0];
  
  if (map.get(key) !== undefined) {     
      map.set(key, map.get(key) + value);
      keyCount[key] = keyCount[key] + 1;
  } else {
      map.set(key, value);
      keyCount[key] = 1;
  }     
});

let newArr = [];
for (let e of map.entries()) { 
   let obj = {};
   obj[e[0]] = e[1] / keyCount[e[0]];
   newArr.push(obj);
}

console.log(newArr);