Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

javascript exclude some values in average calc

Here are some data:

data = [
 {"Age":26,"Level":8},
 {"Age":37,"Level":9},
 {"Age":null,"Level":15},
 {"Age":null,"Level":45}
];

from which I'm trying to calculate average for their properties:

var avg = {};
  var rows = data.length;
  data.forEach(obj => {
      Object.keys(obj).forEach(k => {
        if(obj[k] != null){
          avg[k] = (avg[k] || 0) + obj[k] / rows;
        }
      });
    });

  return avg;

but the problem is in items that has properties with null values, where I'm trying to exclude null values from the calculation, and if you take a look at the the codepen there is Age: 15.75 instead of 31.5 because length of the data is always 4 (and should be 2 since 2 of them are null). How would be the best way to get the length to not be including the nulls?

like image 682
corry Avatar asked Mar 20 '26 08:03

corry


2 Answers

You can have an object with nested object which has two properties value and count

const data = [
 {"Age":26,"Level":8},
 {"Age":37,"Level":9},
 {"Age":null,"Level":15},
 {"Age":null,"Level":45}
];

let avg = {}

data.forEach(x => {
  for(let k in x){
    if(!avg[k]){
      avg[k] = {value:0,count:0};
    }
    if(x[k] !== null){
      avg[k].value += x[k]
      avg[k].count++;
    }
  }
})

avg = Object.fromEntries(Object.entries(avg).map(([k,v]) => ([k,v.value/v.count])))

console.log(avg)
like image 161
Maheer Ali Avatar answered Mar 21 '26 21:03

Maheer Ali


let data = [
	{"Age": 26, "Level": 8},
	{"Age": 37, "Level": 9},
	{"Age": null, "Level": 15},
	{"Age": null, "Level": 45}
];

let averages = data.reduce((values, o) => {
	Object.entries(o).forEach(([k, v]) => {
		if (v !== null)
			values[k] = (values[k] || []).concat(v);
	});
	return values;
}, {});

Object.entries(averages).forEach(([k, vs]) =>
	averages[k] = vs.reduce((a, b) => a + b) / vs.length);

console.log(averages);
like image 29
junvar Avatar answered Mar 21 '26 21:03

junvar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!