简体   繁体   中英

Create new array with Average of same keys in an array of objects

I have an array of object as follows:

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

Their will be N number of objects with any combination keys jan & feb is just an example.

I need to find average of objects with similar keys so that resultant array looks like this:

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

Looking to achieve this without reduce method in JavaScript.

I tried to seperate out objects with similar keys so that ic an sum and average them and push in to a new aray. something like this:

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

But it creates multiple groups for same keys like this in console.

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

A code without using reduce. A bit length though but easy to understand We are using two objects, one is to store the count of the keys and other is for storing the total of the keys. result object has the average.

 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)

Similar to the answer above, but makes use of a map:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM