【问题标题】:Group array of object by key - javascript按键分组对象数组 - javascript
【发布时间】:2021-02-23 11:46:10
【问题描述】:

之前,我确实在互联网上寻找过其他答案,但我仍然无法让它工作,我不知道为什么

所以,我有一个包含对象的数组:

array =[
   {
      "name":"Alex",
      "id":0
   },
   {
      "age":20,
      "id":0
   },
   {
      "name":"John",
      "id":1
   },
   {
      "age":30,
      "id":1
   }
]

我想根据他们的 id 对他们进行分组,所以我希望结果是这样的:

array =[
   [
      {
         "name":"Alex",
         "id":0
      },
      {
         "age":20,
         "id":0
      }
   ],
   [
      {
         "name":"John",
         "id":1
      },
      {
         "age":30,
         "id":1
      }
   ]
]

我找到了一堆可以使用类似方法的答案,所以我试了一下,但我不知道为什么它不起作用

 array.reduce((a, value) => {
       a[value.id] = [...a[value.id] || [], value];
        return a;
    }, [])

谁能解释一下原因?

【问题讨论】:

  • 获取任何“按属性分组的对象数组” 个重复项。它们几乎总是会返回一个对象 ({ "0": [ ... ], "1": [ ... ] })。将此对象传递给Object.values(),您应该会得到预期的结果。
  • 您刚刚进行的编辑使您的代码工作 - 虽然,它目前依赖于您的 ids 是从 0 连续增加的有效数组索引

标签: javascript arrays object ecmascript-6 reduce


【解决方案1】:

那是因为value.index 不存在所以它的值总是undefined

value.index 更改为value.id,它将按预期工作。

const array = [{
    "name": "Alex",
    "id": 0
  },
  {
    "age": 20,
    "id": 0
  },
  {
    "name": "John",
    "id": 1
  },
  {
    "age": 30,
    "id": 1
  }
];

const output = array.reduce((a, value) => {
  a[value.id] = [...a[value.id] || [], value];
  return a;
}, []);
console.log(output);

【讨论】:

    【解决方案2】:

    您使用了错误的密钥-index,应更正为id

    const array = [{
        "name": "Alex",
        "id": 0
      },
      {
        "age": 20,
        "id": 0
      },
      {
        "name": "John",
        "id": 1
      },
      {
        "age": 30,
        "id": 1
      }
    ]
    
    const output = array.reduce((a, value) => {
      a[value.id] = [...a[value.id] || [], value];
      return a;
    }, [])
    
    console.log(output);

    【讨论】:

      【解决方案3】:

      在您的特定示例中,您的对象没有“索引”属性,因此当您调用value.index 时,您将获得undefined。如果您尝试使用 id 字段作为最终数组的索引(我认为您在该 reduce 函数中尝试使用该索引),请尝试以下操作。请注意,如果您的对象中没有从 0 开始的连续 id,那么您将在最终数组中插入空值。您可以通过对最终数组执行array.filter((el) => el ); 之类的操作来删除它们。

      array.reduce((a, value) => {
        if (a[value.id]) {
          a[value.id].push(value);
        } else {
          a[value.id] = [value];
        }
        return a;
      }, []);
      

      【讨论】:

        【解决方案4】:

        您实际上遇到了一个错字问题并通过编辑修复了它,但是如果您想让它与任意 ID-s 一起工作(正如评论指出的那样,01 是有效且“早期”的数组索引),您可能想使用Map,并在最后得到它的values()

        const array = [{
            "name": "Alex",
            "id": 80
          },
          {
            "age": 20,
            "id": 80
          },
          {
            "name": "John",
            "id": 100
          },
          {
            "age": 30,
            "id": 100
          }
        ]
        
        const map = array.reduce((a, value) => {
          a.set(value.id, [...a.get(value.id) || [], value]);
          return a;
        }, new Map())
        const output = Array.from(map.values());
        
        console.log(output);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          • 2021-03-29
          • 1970-01-01
          • 1970-01-01
          • 2021-01-30
          • 1970-01-01
          相关资源
          最近更新 更多