JavaScript добавление нуля для несуществующих ключей в массиве - PullRequest
3 голосов
/ 27 марта 2020

У меня есть два массива:

date_array = ["2020-02-27", "2020-02-28", "2020-02-29", "2020-03-01", "2020-03-02", "2020-03-03", "2020-03-04", "2020-03-05", "2020-03-06", "2020-03-07", "2020-03-08", "2020-03-09", "2020-03-10", "2020-03-11", "2020-03-12", "2020-03-13", "2020-03-14", "2020-03-15", "2020-03-16", "2020-03-17", "2020-03-18", "2020-03-19", "2020-03-20", "2020-03-21", "2020-03-22", "2020-03-23", "2020-03-24", "2020-03-25", "2020-03-26", "2020-03-27"]

и

count_array=[{date: "2020-03-22", count: 310},
 {date: "2020-03-23", count: 115},
 {date: "2020-03-24", count: 78},
 {date: "2020-03-25", count: 29},
 {date: "2020-03-26", count: 36},
 {date: "2020-03-27", count: 3}]

Мне нужно создать третий массив из 30 элементов, имеющих только значения количества, если количество не присутствует за этот день возвращается 0. Как мне этого добиться?

Я пытался:

date_array.forEach(element => {
                if (
                  data[date_array.indexOf(element)].date ==
                  date_array[element]
                ) {
                  target_array.push(data[data.indexOf(element)].count_array);
                } else {
                  target_array.push(0);
                }
            });

Но я получаю «Не удается прочитать свойство« дата »из неопределенного» * ​​1012 *

Ответы [ 2 ]

4 голосов
/ 27 марта 2020

Чтобы уменьшить вычислительную сложность, сначала преобразуйте массив в объект, проиндексированный по дате. Затем, чтобы создать выходной массив, просто .map date_array ищите дату на объекте, чередуя с 0:

date_array = ["2020-02-27", "2020-02-28", "2020-02-29", "2020-03-01", "2020-03-02", "2020-03-03", "2020-03-04", "2020-03-05", "2020-03-06", "2020-03-07", "2020-03-08", "2020-03-09", "2020-03-10", "2020-03-11", "2020-03-12", "2020-03-13", "2020-03-14", "2020-03-15", "2020-03-16", "2020-03-17", "2020-03-18", "2020-03-19", "2020-03-20", "2020-03-21", "2020-03-22", "2020-03-23", "2020-03-24", "2020-03-25", "2020-03-26", "2020-03-27"]
count_array=[{date: "2020-03-22", count: 310},
 {date: "2020-03-23", count: 115},
 {date: "2020-03-24", count: 78},
 {date: "2020-03-25", count: 29},
 {date: "2020-03-26", count: 36},
 {date: "2020-03-27", count: 3}]

const countsByDate = Object.fromEntries(
  count_array.map(({ date, count }) => [date, count])
);
const output = date_array.map(date => countsByDate[date] || 0);
console.log(output);
1 голос
/ 27 марта 2020

Я бы go за решение, опубликованное @CertainPerformance, однако просто для того, чтобы предоставить альтернативу, в современном javascript (Babel, и новая версия современных браузеров), возможно иметь что-то вроде:

var count = date_array.map(date => 
              count_array.find(item => item.date === date)?.count ?? 0);

См. метод массива , необязательное сцепление и nulli sh объединение операторов.

Кроме того, это не очень оптимизировано, поскольку find ищет во всем массиве для каждой итерации map (и поэтому я бы go для другого ответа), но для небольшого массива это незначительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...