Получение суммы определенного поля для объектов в массиве в JavaScript - PullRequest
0 голосов
/ 29 июня 2018

Я знаю, что могу использовать Reduce для суммирования чисел массива, например:

let numArray = [1, 2, 3, 4].reduce((a, b) => a + b, 0);
console.log(numArray);

Однако, если у меня есть массив объектов, значением одного поля которых является число, как бы мне получить сумму только этого поля для объектов в массиве?

Скажем, например, для такого рода структуры данных:

[
  {
    name: "John Smith",
    balance: 42
  },
  {
    name: "Jane Doe",
    balance: 24
  }
]

Как бы я использовал Reduce, чтобы получить сумму только поля "баланса" для всех объектов в массиве?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Всегда очищайте числовое значение объекта, иначе вы можете получить неожиданные результаты:

var arr = [{
  name: "John Smith",
  balance: 42
}, {
  name: "Jane Doe",
  balance: 24
}, {
  name: "Jane Doe Str",
  balance: "24"
}, {
  name: "Jane Smith Str",
  balance: "42"
}];

var okResult = arr.reduce((a, curr) => a + (curr.balance ? parseInt(curr.balance) : 0), 0);

var wrongResult = arr.reduce((a, curr) => a + curr.balance, 0);


console.log("Ok: ", okResult);
console.log("Wrong: ", wrongResult);
0 голосов
/ 29 июня 2018

Попробуйте следующее:

var arr = [{name: "John Smith",balance: 42},{name: "Jane Doe",balance: 24}];

var result = arr.reduce((a,curr) => a + curr.balance, 0);

console.log(result);

Вы можете даже сделать универсальную функцию для этого как:

var arr = [{name: "John Smith",balance: 42, average : 20},{name: "Jane Doe",balance: 24,  average : 30}];

function getSumFromObjects(arr,prop) {
  return arr.reduce((a,curr) => a + curr[prop], 0);
}
  
//get sum of prop balance
console.log(getSumFromObjects(arr,"balance"));

//get sum of prop average
console.log(getSumFromObjects(arr,"average"));
...