【发布时间】:2018-06-06 23:52:43
【问题描述】:
我正在尝试按共享的相似对象对一些 JavaScript 对象进行分组。我可以在 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'
}
}
]
在 UI 中,我们将按对象所在的房间显示对象。我们需要保留对房间本身的引用,否则我们只需按房间属性排序。
我想要做的是将数据重塑成这样的:
{
{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'}]
]
不管结果如何,我们只需要按房间按线性时间分组的人。
我试过 lodash 的 groupBy,同时使用 map 和 reduce,只是做 for 循环将列表放在一起等等。我很难过,因为无法使用对象文字(房间)作为哈希索引,我不知道如何通过内部对象有效地对外部对象进行分组。
非常感谢任何帮助。
更新:增加关于尝试以线性时间复杂度执行此操作的清晰度 - 此 Ruby 代码的最有效等效项:
h = Hash.new { |h, k| h[k] = [] }
value.each_with_object(h) { |v, m| m[v[:room]] << v }
【问题讨论】:
标签: javascript grouping lodash graphql