Я пытаюсь сгруппировать некоторые объекты JavasScript по их общим похожим объектам.Я могу сделать это без усилий в Ruby, но за всю свою жизнь я (несколько неловко) не могу понять это в JS за линейное время.JS, по-видимому, не допускает использование литералов объектов в качестве ключей, по крайней мере, в целях сокращения.
У меня есть данные в такой форме, как результат запроса GraphQL:
[
{
id: 1,
name: 'Bob',
room: {
id: 5,
name: 'Kitchen'
}
},
{
id: 3,
name: 'Sheila',
room: {
id: 5,
name: 'Kitchen'
}
},
{
id: 2,
name: 'Tom',
room: {
id: 3,
name: 'Bathroom'
}
}
]
В пользовательском интерфейсе мы собираемся отображать объекты по комнате, в которой они находятся. Нам нужно сохранить ссылку на саму комнату, иначе мы просто отсортировали бы по свойствам комнаты.
Что яя пытаюсь сделать, это преобразовать данные в что-то вроде этого:
{
{id: 5, name: 'Kitchen'}: [{id: 1, name: 'Bob'}, {id: 3, name: 'Sheila'}],
{id: 3, name: 'Bathroom'}: [{id: 2, name: 'Tom'}]
}
Как вы можете видеть, люди сгруппированы по комнате, в которой они находятся.
Это также можетиметь такую форму ...
[
{ room: {id: 5, name: 'Kitchen'}, people: [{id: 1, name: 'Bob', ...}] },
{ room: {id: 3, name: 'Bathroom', people: [{id: 2, name: 'Tom'}]
]
Как бы то ни было, нам просто нужны люди, сгруппированные по комнатам по линейному времени.
Я пробовал Лодаша groupBy
, используяи map
, и reduce
, просто выполняю циклы for
, которые составляют список, и т. д. Я в замешательстве, потому что, не имея возможности использовать литерал объекта (комнату) в качестве хеш-индекса, я не знаюкак эффективно группировать внешние объекты по внутренним объектам.
Любая помощь очень полезнаPreciated.
Обновление: добавление ясности в попытке сделать это с линейной сложностью по времени - наиболее эффективный эквивалент этого кода Ruby:
h = Hash.new { |h, k| h[k] = [] }
value.each_with_object(h) { |v, m| m[v[:room]] << v }