Подсчет суммы значений в массиве JSON - PullRequest
4 голосов
/ 10 апреля 2020

Имея такой массив:

const data = [
    {
        "name": "Dave",
        "coins": 14,
        "weapons": 2,
        "otherItems": 3,
        "color": "red"
    },
    {
        "name": "Vanessa",
        "coins": 18,
        "weapons": 1,
        "otherItems": 5,
        "color": "blue"
    },
    {
        "name": "Sharon",
        "coins": 9,
        "weapons": 5,
        "otherItems": 1,
        "color": "pink"
    },
    {
        "name": "Walter",
        "coins": 9,
        "weapons": 2,
        "otherItems": 4,
        "color": "white"
    }
]

Как рассчитать сумму coins, weapons и otherItems с использованием функций ES6? (Я не привязан к этому: любой простой метод был бы хорош.)

data.reduce((first, last) => first + last) генерирует цепочку [object Object][object Object] s ...

Ответы [ 4 ]

4 голосов
/ 10 апреля 2020

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

const data = [
    {
        "name": "Dave",
        "coins": 14,
        "weapons": 2,
        "otherItems": 3,
        "color": "red"
    },
    {
        "name": "Vanessa",
        "coins": 18,
        "weapons": 1,
        "otherItems": 5,
        "color": "blue"
    },
    {
        "name": "Sharon",
        "coins": 9,
        "weapons": 5,
        "otherItems": 1,
        "color": "pink"
    },
    {
        "name": "Walter",
        "coins": 9,
        "weapons": 2,
        "otherItems": 4,
        "color": "white"
    }
]

let result = data.reduce((a,c)=> ({ 
     coins: a.coins + c.coins, 
     weapons: a.weapons + c.weapons, 
     otherItems: a.otherItems + c.otherItems })
)

console.log(result);
2 голосов
/ 10 апреля 2020

Вы можете взять массив искомых ключей для сумм, создать объект для сумм и добавить искомые значения.

const
    data = [{ name: "Dave", coins: 14, weapons: 2, otherItems: 3, color: "red" }, { name: "Vanessa", coins: 18, weapons: 1, otherItems: 5, color: "blue" }, { name: "Sharon", coins: 9, weapons: 5, otherItems: 1, color: "pink" }, { name: "Walter", coins: 9, weapons: 2, otherItems: 4, color: "white" }],
    keys = ['coins', 'weapons', 'otherItems'],
    sums = data.reduce(
        (r, o) => (keys.forEach(k => r[k] += o[k]), r), 
        Object.fromEntries(keys.map(k => [k, 0]))
    );

console.log(sums);
1 голос
/ 10 апреля 2020

Вы можете использовать Array.prototype.reduce для этого.

Чтобы сделать его немного более гибким и динамичным c, создайте Set ключей, для которых вы хотите получить счет.

Затем go через каждый ключ в Set, и если этот ключ находится в obj, суммируйте его в объекте accumulator в обратном вызове Reduce:

const data = [{"name":"Dave","coins":14,"weapons":2,"otherItems":3,"color":"red"},{"name":"Vanessa","coins":18,"weapons":1,"otherItems":5,"color":"blue"},{"name":"Sharon","coins":9,"weapons":5,"otherItems":1,"color":"pink"},{"name":"Walter","coins":9,"weapons":2,"otherItems":4,"color":"white"}]

//Keys to count
const keys = new Set(["coins", "weapons", "otherItems"]);

const count = data.reduce((acc, obj) => {
  const objKeys = keys.forEach(key => {
    if (obj.hasOwnProperty(key)) {
      acc[key] = (acc[key] || 0) + obj[key];
    }
  });
  return acc;
}, {});
console.log(count);
0 голосов
/ 10 апреля 2020

Ваша идея верна, вам нужно использовать reduce метод. Проблема в том, что вы суммируете два объекта, а не их свойства. Все, что вам нужно сделать, это изменить код на следующее (для суммирования монет):

data.reduce((first, last) => first.coins + last.coins, 0)

И следующее для оружия:

data.reduce((first, last) => first.weapons + last.weapons, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...