按键对数组进行分组
Grouping an array by key
所以我有这个数据结构:
const Array= [
{
court: 'court1',
judge: 'judge1'
},
{
court: 'court1',
judge: 'judge3'
},
{
court: 'court1',
judge: 'judge2'
},
{
court: 'court1',
judge: 'judge1'
},
{
court: 'court2',
judge: 'judge1'
},
{
court: 'court2',
judge: 'judge2'
}
]
应该修改成这样:
Obj = {
court1: ["judge1", "judge3", "judge2"],
court2: ["judge1", "judge2"]
}
所以最后我找到了一些决定并像这样编辑自己:
let result = Array.reduce((acc, cur) => {
acc[cur.court] = acc[cur.court] || []
if (acc[cur.court].indexOf(cur.judge) === -1) {
acc[cur.court].push(cur.judge)
}
return acc
}, Object.create(null))
console.log(result)
但我试图理解为什么 acc[cur.court] = acc[cur.court] || []
行会像这样创建一个新对象:
Obj = {
court1: [],
court2: []
}
你能解释一下吗?也许你知道更优雅的决定?
谢谢!
acc
最初是一个空对象。在 reduce
回调中,唯一分配给它的属性,在行 acc[cur.court] = acc[cur.court] || []
中,是数组,并且数组是真实的。
如果 属性 存在于 cur.court
,acc[cur.court] || []
将计算为 属性。否则,它将评估为一个空数组。然后,它将结果分配给 acc[cur.court]
.
一种不那么混乱的写法,同时做同样的事情,将是:
if (!acc[cur.court]) {
acc[cur.court] = [];
}
虽然我更喜欢使用上面的 if
语句,但代码看起来已经很合理了,因为它看起来不那么混乱。
另一种选择是 avoid reduce
entirely 当累加器始终是同一个对象时,正如某些人所说:
const result = {};
for (const { court, judge } of Array) {
if (!result[court]) {
result[court] = [];
}
result[court].push(judge);
}
(如果可能,还要更改 Array
变量名称,可能会更改为 arr
或其他名称。它正在隐藏 window.Array
,这可能会造成混淆和错误)
所以我有这个数据结构:
const Array= [
{
court: 'court1',
judge: 'judge1'
},
{
court: 'court1',
judge: 'judge3'
},
{
court: 'court1',
judge: 'judge2'
},
{
court: 'court1',
judge: 'judge1'
},
{
court: 'court2',
judge: 'judge1'
},
{
court: 'court2',
judge: 'judge2'
}
]
应该修改成这样:
Obj = {
court1: ["judge1", "judge3", "judge2"],
court2: ["judge1", "judge2"]
}
所以最后我找到了一些决定并像这样编辑自己:
let result = Array.reduce((acc, cur) => {
acc[cur.court] = acc[cur.court] || []
if (acc[cur.court].indexOf(cur.judge) === -1) {
acc[cur.court].push(cur.judge)
}
return acc
}, Object.create(null))
console.log(result)
但我试图理解为什么 acc[cur.court] = acc[cur.court] || []
行会像这样创建一个新对象:
Obj = {
court1: [],
court2: []
}
你能解释一下吗?也许你知道更优雅的决定? 谢谢!
acc
最初是一个空对象。在 reduce
回调中,唯一分配给它的属性,在行 acc[cur.court] = acc[cur.court] || []
中,是数组,并且数组是真实的。
如果 属性 存在于 cur.court
,acc[cur.court] || []
将计算为 属性。否则,它将评估为一个空数组。然后,它将结果分配给 acc[cur.court]
.
一种不那么混乱的写法,同时做同样的事情,将是:
if (!acc[cur.court]) {
acc[cur.court] = [];
}
虽然我更喜欢使用上面的 if
语句,但代码看起来已经很合理了,因为它看起来不那么混乱。
另一种选择是 avoid reduce
entirely 当累加器始终是同一个对象时,正如某些人所说:
const result = {};
for (const { court, judge } of Array) {
if (!result[court]) {
result[court] = [];
}
result[court].push(judge);
}
(如果可能,还要更改 Array
变量名称,可能会更改为 arr
或其他名称。它正在隐藏 window.Array
,这可能会造成混淆和错误)