-3

var average = [];

var test = [{
  "name": "Lem",
  "employee_id": "2177",
  "score": "50"
}, {
  "name": "Ian",
  "employee_id": "2179",
  "score": "50"
}, {
  "name": "Lem",
  "employee_id": "2177",
  "score": "90"
}, {
  "name": "Ian",
  "employee_id": "2179",
  "score": "40"
}, {
  "name": "Jm",
  "employee_id": "2174",
  "score": "90"
}, {
  "name": "Jm",
  "employee_id": "2174",
  "score": "90"
}]

console.log("test", test);

$.each(test, function(_, tes) {
  average.push(tes.score);

  console.log("average", average);
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Im getting this output.

"average", ["50", "50", "90", "40", "90", "90"]

I am trying to get the average based on their employee Id. How can I get this output.

average = [{70,45,90}]
Reyno
  • 6,119
  • 18
  • 27
  • 2
    Please describe your question more clearly. – Chang Alex Aug 04 '22 at 08:36
  • 2
    Short answer: there is no way to get what you need. The syntax of the expression you want is invalid. An Object can not contain only keys, so please clarify the requirements. Also, I'd suggest to not use jquery. Arrays already have what you need. test.forEach(function(item) { // do you stuff with an array item here }); – zamuka Aug 04 '22 at 08:47

2 Answers2

0

You can use this code :

const groupBy = (arr, key) => {
    return arr.reduce((rv, x) => {
        (rv[x[key]] = rv[x[key]] || []).push(x);
        return rv;
    }, {});
};

const sum = arr => arr.reduce((ps, a) => ps + a, 0);

const avg = arr => sum(arr) / arr.length;

let employee = [{
    "name": "Lem",
    "employee_id": "2177",
    "score": "50"
  }, {
    "name": "Ian",
    "employee_id": "2179",
    "score": "50"
  }, {
    "name": "Lem",
    "employee_id": "2177",
    "score": "90"
  }, {
    "name": "Ian",
    "employee_id": "2179",
    "score": "40"
  }, {
    "name": "Jm",
    "employee_id": "2174",
    "score": "90"
  }, {
    "name": "Jm",
    "employee_id": "2174",
    "score": "90"
  }];

let grouped = groupBy(employee, 'employee_id');
let average = Object.keys(grouped).map(key => ({ employee_id: grouped[key].at(0).employee_id, average: avg(grouped[key].map(e => parseInt(e.score) ?? 0)) }));
console.log(average);
nem0z
  • 1,060
  • 1
  • 4
  • 17
0

Another solution

const input = [{
  "name": "Lem",
  "employee_id": "2177",
  "score": "50"
}, {
  "name": "Ian",
  "employee_id": "2179",
  "score": "50"
}, {
  "name": "Lem",
  "employee_id": "2177",
  "score": "90"
}, {
  "name": "Ian",
  "employee_id": "2179",
  "score": "40"
}, {
  "name": "Jm",
  "employee_id": "2174",
  "score": "90"
}, {
  "name": "Jm",
  "employee_id": "2174",
  "score": "90"
}];

const res = input.reduce((p, c) => {
  const score = Number(c['score']);
  const id = Number(c['employee_id']);
  const index = p.findIndex(x => x.id === id);
  index >= 0 ? p[index].scores.push(score) : p.push({
    id: id,
    scores: [score]
  });
  return p;
}, []).map(p => {
  return {
    employee_id: p.id,
    average: p.scores.reduce((p, c) => p + c, 0) / p.scores.length
  };
});

console.log(res);
soupy-norman
  • 403
  • 2
  • 11