按键对数组进行分组[重复]
Posted
技术标签:
【中文标题】按键对数组进行分组[重复]【英文标题】:Grouping an array by key [duplicate] 【发布时间】:2020-06-06 14:07:43 【问题描述】:所以我有这个数据结构:
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: []
你能解释一下吗?也许你知道更优雅的决定? 谢谢!
【问题讨论】:
【参考方案1】: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
,这可能会造成混淆和错误)
【讨论】:
惊人的答案!非常感谢,祝你好运)以上是关于按键对数组进行分组[重复]的主要内容,如果未能解决你的问题,请参考以下文章