Как добавить одинаковые значения обьекта в один массив?

Пишу приложения для погоды и хочу чтобы обьекты с одной датой(дня) помещались в созданный div. API погоды

То есть dt_txt с одинаковым значением помещать в один массив. То есть у меня прогноз на неделю. Нужно чтобы 31 - 1 - 2 и т.д., помещались в разные массивы, чтобы я смог их уже вывести на страницу в html блоке


Ответы (1 шт):

Автор решения: Максим Вишневский

Если я правильно понял вашу задачу, то вам нужно будет сделать что-то такое ({ dt_txt } - это деструктуризация, вот документация по Object.values):

const weatherItems = []; // входные данные с погодой

const generateWeatherRenderConfig = (items) => items.reduce((acc, item) => {
  const { dt_txt } = item; // извлекаем значение dt_txt

  // если айтемов с таким dt_txt нет, инициализируем пустой массив для этого значения
  if (!acc[dt_txt]) {
    acc[dt_txt] = [];
  }

  acc[dt_txt].push(item); // добавляем айтем с погодой

  return acc;
}, {});

/**
 * Результат будет такой,
 * если вам будет нужен массив массивов,
 * то просто воспользуйтесь Object.values(),
 * для сортировки по датам можно в генераторе добавить кастомный sort():
 *
 * {
 *   '2020-10-30 15:00:00': [],
 *   '2020-10-31 15:00:00': [],
 * }
 */
const config = generateWeatherRenderConfig(weatherItems);

Либо изначально сформировать массив дат и отсортировать их:

const dates = weatherItems
  .reduce((acc, { dt_txt }) => {
    if (!acc.includes(dt_txt)) {
      acc.push(dt_txt);
    }

    return acc;
  }, [])
  .sort((a, b) => new Date(a) - new Date(b));

На основе него сделать объект с последовательными ключами с пустыми массивами в качестве значений:

const datesConfig = dates.reduce((acc, date) => {
  acc[date] = [];
  return acc;
}, {});

Можно сразу сформировать удобную структуру для генерации нужных вам данных, но это уже выходит за рамки подобного ответа)

→ Ссылка