den0820
@den0820
Фронтенд Junior разработчик.

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

Добрый вечер! Допустим у меня есть массив объектов:
[
	{
		date: "2017-12-19 19:00",
		id: "100d7362faa78135e0e1a102",
		index: "3",
		lesson_id: "599d7362faa78135e0e1a703"
	},
	{
		date: "2018-01-03 18:00",
		id: "100d7362faa78135e0e1a103",
		index: "3",
		lesson_id: "599d7362faa78135e0e1a7034"
	},
	{
		date: "2018-01-04 16:00",
		id: "100d7362faa78135e0e1a104",
		index: "3",
		lesson_id: "599d7362faa78135e0e1a7035"
	},
	{
		date: "2018-02-05 19:00",
		id: "100d7362faa78135e0e1a105",
		index: "3",
		lesson_id: "599d7362faa78135e0e1a7036"
	},
	{
		date: "2018-02-03 12:00",
		id: "100d7362faa78135e0e1a106",
		index: "3",
		lesson_id: "599d7362faa78135e0e1a7037"
	},
	{
		date: "2018-03-05 19:00",
		id: "100d7362faa78135e0e1a109",
		index: "3",
		lesson_id: "599d7362faa78135e0e1a7039"
	},
	{
		date: "2018-03-05 12:00",
		id: "100d7362faa78135e0e1a108",
		index: "3",
		lesson_id: "599d7362faa78135e0e1a7038"
	},
	{
		date: "2018-04-04 19:00",
		id: "100d7362faa78135e0e1a109",
		index: "3",
		lesson_id: "599d7362faa78135e0e1a7039"
	}
]


Я хотел бы сгруппировать объекты, у которых одинаковая дата, а именно год-месяц-день (без учета времени) в подмассивы. Пытаюсь сделать это с помощью метода Reduce , который предоставляют Массивы, но пока ничего толькового не группирует. Может кто сможет помочь разобраться?
  • Вопрос задан
  • 2609 просмотров
Решения вопроса 2
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
function groupByDate(arr) {
  //свертка массива во временный объект, с датами в качестве ключей
  const temp = arr.reduce((acc, elem) => {
    // делим строку по пробелу и извлекаем 0й элемент '2018-03-05 12:00' -> '2018-03-05'
    const date = elem.date.split(' ')[0];
    //если ключа-даты еще нет в объекте, записываем туда пустой массив
    if(!acc[date]) {
      acc[date] = [];
    }
    // ложим текущий элемент в соответствующий массив
    acc[date].push(elem);
    return acc;
  }, {});
  // извлекаем все ключи получившегося объекта в массив
  // и преобразуем массив ключей в массив значений
  return Object.getOwnPropertyNames(temp).map(k => temp[k]);
}
Ответ написан
Stalker_RED
@Stalker_RED
var result = data.reduce((acc, item)=>{
	var date = item.date.split(' ')[0]
  if (acc[date]) {
    acc[date].push(item)
  } else {
    acc[date] = [item]
  }
  return acc
}, {})
https://jsfiddle.net/d7muwhuz/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы