Рассчитать сумму свойства объекта и сохранить их в массиве - PullRequest
1 голос
/ 16 апреля 2020

Итак, у меня есть файл JSON, в котором есть данные для всех стран мира. Каждая страна представляет собой массив объектов. Каждый объект в массиве имеет свойство Date, подтвержденное свойство et c.

{
  "Afghanistan": [
    {
      "date": "2020-1-22",
      "confirmed": 5,
      "deaths": 0,
      "recovered": 0
    },
    {
      "date": "2020-1-23",
      "confirmed": 7,
      "deaths": 0,
      "recovered": 0
    }],
"Albania": [
    {
      "date": "2020-1-22",
      "confirmed": 3,
      "deaths": 0,
      "recovered": 0
    },
    {
      "date": "2020-1-23",
      "confirmed": 10,
      "deaths": 0,
      "recovered": 0
    }]
}

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

Итак, скажем, у нас есть 2 дня, и у нашего массива будет 2 элемента, для первого элемента я хочу получить сумму подтвержденных для каждой страны на 2020-1-22 годы, а для второго элемента - подтверждено для каждой страны на 2020-1-23 гг. Таким образом, массив должен выглядеть примерно так:

[8 , 17]

Возможно, это что-то простое, но, похоже, я не могу обернуться вокруг него, чтобы найти решение. Я изучал похожие решения, используя методы сокращения и отображения, но когда я пытаюсь применить к своему случаю, мой мозг просто становится слишком озадаченным.

Ответы [ 3 ]

3 голосов
/ 16 апреля 2020

Вы можете сделать это, используя reduce и forEach. Я также изменяю формат вывода, вместо массива я возвращаю объект.

const records = {Afghanistan: [{date: "2020-1-22",confirmed: 5,deaths: 0,recovered: 0},{date: "2020-1-23",confirmed: 7,deaths: 0,recovered: 0}],Albania: [{date: "2020-1-22",confirmed: 3,deaths: 0,recovered: 0},{date: "2020-1-23",confirmed: 10,deaths: 0,recovered: 0}]};

const res = Object.values(records).reduce((acc, curr) => {
    curr.forEach(item => {
	acc[item.date] = (acc[item.date] || 0) + item.confirmed;
    });
    return acc;
}, {})

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

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

[[{ "date": "2020-1-22", "confirmed": 5, "deaths": 0, "recovered": 0 }, { "date": "2020-1-23", "confirmed": 7, "deaths": 0, "recovered": 0 } ], ... ]

Затем вы можете использовать .reduce() в этом массиве для накопления в новом Map экземпляр, где каждый ключ является датой, а каждое значение, сохраненное датой, является суммой общего количества / суммы. Чтобы получить эти значения, вам нужно провести l oop через каждый объект в массиве значений объекта и выполнить преобразование, чтобы получить дату и количество подтвержденных случаев для этого конкретного объекта (здесь я делаю это с помощью деструктурирования {date, [key]: amt}). Затем вы можете установить значение даты для карты как ранее сохраненное значение (если присутствует, если не используется 0), добавленное к текущей сумме. Затем вы можете получить .values() с карты и использовать Array.from() для преобразования итерируемого в массив:

const data = { "Afghanistan": [{ "date": "2020-1-22", "confirmed": 5, "deaths": 0, "recovered": 0 }, { "date": "2020-1-23", "confirmed": 7, "deaths": 0, "recovered": 0 } ], "Albania": [{ "date": "2020-1-22", "confirmed": 3, "deaths": 0, "recovered": 0 }, { "date": "2020-1-23", "confirmed": 10, "deaths": 0, "recovered": 0 } ] };

const sumByKey = (key, data) =>
  Array.from(Object.values(data).reduce((map, objs) =>
    objs.reduce((m, {date, [key]: amt}) => m.set(date, (m.get(date) || 0) + amt), map), new Map).values()
  );

console.log(sumByKey('confirmed', data));
1 голос
/ 16 апреля 2020

Этот код даст вам пары ключ-значение дат и значений

const countries = {
  Afghanistan: [
    {
      date: "2020-1-22",
      confirmed: 5,
      deaths: 0,
      recovered: 0,
    },
    {
      date: "2020-1-23",
      confirmed: 7,
      deaths: 0,
      recovered: 0,
    },
  ],
  Albania: [
    {
      date: "2020-1-22",
      confirmed: 3,
      deaths: 0,
      recovered: 0,
    },
    {
      date: "2020-1-23",
      confirmed: 10,
      deaths: 0,
      recovered: 0,
    },
  ],
};

const objects = {};
const arrayOfResults = [];

for (const country in countries) {
  for (const data of countries[country]) {
    objects[data.date] = objects[data.date] + data.confirmed || data.confirmed;
  }
}

//currently we have a key-value pair of dates and total cases
// like this { '2020-1-22': 8, '2020-1-23': 17 }
// which in my opinion better represents the data

//get the results as an array in you case
for (const key in objects) {
  arrayOfResults.push(objects[key]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...