按 javascript 对象中的键值对对象进行分组

group objects by values of a key in javascript object

我有一个输入对象,例如:

[{
        "id": "123",
        "title": "Article 1",
        "evaluationLevel": {
            "levelName":A
        },
        "category": ["Category 1", "Category 2", "Category 3"]
    },
    {
        "id": "234",
        "title": "Article 2",
        "evaluationLevel": {
            "levelName":B 
        },
        "category": ["Category 2", "Category 4"]
    },
    {
        "id": "567",
        "title": "Article 3",
        "evaluationLevel": {
            "levelName":C
        },
        "category": ["Category 1"]
}]

我需要的输出是:

{
   "Category 1": [
      ["1", "Article 1", A],
      ["2", "Article 3", C]

   ],
   "Category 2": [
      ["3", "Article 1", A],
      ["4", "Article 2", B]

   ],
   "Category 3": [
      ["5", "Article 1", A]

   ],
   "Category 4": [
      ["6", "Article 2", C]
   ]
}

在 javascript 中是否有任何更简洁的方法来对像这样的对象进行分组。我在 中发现了类似的问题。区别在于我需要按类别对象的值对对象进行分组。

您可以使用 array#reduce 将数组分组。一旦你有了这个对象,就给它添加索引。

let index = 0;
const data = [{ "id": "123", "title": "Article 1", "evaluationLevel": { "levelName": 'A' }, "category": ["Category 1", "Category 2", "Category 3"] }, { "id": "234", "title": "Article 2", "evaluationLevel": { "levelName": 'B' }, "category": ["Category 2", "Category 4"] },{ "id": "567", "title": "Article 3", "evaluationLevel": { "levelName": 'C' }, "category": ["Category 1"] }],
      result = data.reduce((r,o,i) => {
        o.category.forEach((category, j) => {
          r[category] = r[category] || [];
          r[category].push([o.title, o.evaluationLevel.levelName])
        });
        return r;
      },{}),
      output = Object.keys(result).reduce((r,k) => {
        result[k].forEach((item) => {
          index++;
          r[k] = r[k] || [];
          r[k].push([index, ...item]);
        });
        return r;
      }, {})
console.log(output);