我有一个对象数组,如下所示:
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}];
答案 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);