Tarun Bhati
Tarun Bhati

Reputation: 356

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

Upvotes: 1

Views: 669

Answers (2)

Nicholas K
Nicholas K

Reputation: 15423

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

Upvotes: 1

Harmandeep Singh Kalsi
Harmandeep Singh Kalsi

Reputation: 3345

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)

Upvotes: 1

Related Questions