首页 > 解决方案 > 在对象数组中创建具有相同键平均值的新数组

问题描述

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

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

它们将是 N 个具有任意组合键的对象 jan 和 feb 只是一个示例。

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

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

希望在 JavaScript 中不使用 reduce 方法来实现这一点。

我试图用相似的键分离出对象,以便对它们求和并对它们进行平均并推入一个新的数组。像这样的东西:

arr.forEach(a=>{
   console.log(Object.keys(a))
   console.log(arr.filter(ar=>ar.hasOwnProperty(Object.keys(a)[0])))
})

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

[ {"jan":2},{"jan":5} ]
[ {"jan":2},{"jan":5} ]
[ {"feb":3},{"feb":1} ]
[ {"feb":3},{"feb":1} ]

标签: javascriptarraysaverage

解决方案


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

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);


推荐阅读