【问题标题】: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: []
}

你能解释一下吗?也许你知道更优雅的决定? 谢谢!

【问题讨论】:

    标签: javascript arrays reduce


    【解决方案1】:

    acc 最初是一个空对象。在reduce 回调中,唯一分配给它的属性(acc[cur.court] = acc[cur.court] || [] 行)是数组,而数组是真值。

    如果属性存在于cur.courtacc[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,这可能会造成混淆和错误)

    【讨论】:

    • 惊人的答案!非常感谢,祝你好运)
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2012-02-19
    相关资源
    最近更新 更多