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

{
  date: "20181206",
  hours: "4",
  projectId: "65WchP9X46HlOYUzmWrL",
  taskId: "fJTU7wggJHbg1uRuRUdHjS5mn8J3"
}

Мне нужно сгруппировать в отдельные массивы все объекты по уникальным комбинациям свойств ProjectId - TaskId, чтобы каждый результирующий массив получал все записи для одного конкретного проекта и одной конкретной задачи (массив для project #1 / task #1, еще один для project #1 / task #2, еще один для project #2 / task #1 и т. Д.).

Я знаю, как это сделать с одним свойством, но есть ли простой способ добиться того же с двумя свойствами?

Примечание: мой глобальный массив изначально заполнен следующим образом:

weekTimes = [];
querySnapshot.forEach((doc) => {
  weekTimes.push(doc.data());
});
0
drake035 3 Дек 2018 в 22:23

1 ответ

Лучший ответ

Создайте составной ключ из projectId и taskId:

grouped = {}

for (weekTime of weekTimes) {
  var key = `${weekTime.projectId}/${weekTime.taskId}`

  if (grouped[key] === undefined) {
    // if the key doesn't exist, weekTime is the first item, create the key 
    // and assign an array with the first item to it
    grouped[key] = [ weekTime ]
  } else {
    // if the key already exists in grouped, just push new item to that key
    grouped[key].push(weekTime)
  }
}

// if you don't need the keys
Object.values(grouped)

Или используйте lodash groupby:

const _ = require('lodash')

_.groupBy(weekTimes, x => x.projectId + '/' + x.taskId)
1
Psidom 5 Дек 2018 в 16:06