【问题标题】:Create new array with Average of same keys in an array of objects在对象数组中创建具有相同键平均值的新数组
【发布时间】:2020-07-17 10:47:58
【问题描述】:

我有一个对象数组如下:

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} ]

【问题讨论】:

  • “具有相似键”有什么相似之处?一样吗?
  • @NikitaMadeev 我提到过,需要不使用reduce方法。
  • 请添加您的尝试。
  • 到目前为止你尝试了什么?
  • 是否保证每个对象只有一个属性?

标签: javascript arrays average


【解决方案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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 2016-01-30
      • 2015-04-17
      • 1970-01-01
      • 2018-12-30
      • 2022-06-10
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多