JavaScript 如何根据对象属性进行分组,当属性是一个数组时?

3

我目前有一个项数组,看起来有点像这样:我想按分类查找将这些项分组,但问题是分类查找可能是一个数组,因此父项2将被列在两个地方(一次在My Cat中,一次在其他地方)。我尝试使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/groupBy,但它似乎无法处理这个问题?

     [
           {
                "tool_id": "4-19de-454673d9-9ef5-4545",
                "somekey" : "Parent Item 2"
                "categoryLookup": [
                    {
                        "category_name": "New Item",
                    }
                ]
            },
            {
                "tool_id": "be7ea707-19de-43d9-9ef1-d4a3ff79f77a",
                "somekey" : "Parent Item"
                "categoryLookup": [
                    {
                        "category_name": "My Cat",
                    },
                    {
                        "category_name": "Something Else",
                    }
                ]
            }
     ]

最终结果将会是这样的:
    [
       {
           New Item: [
              {...contains 4-19de-454673d9-9ef5-4545 }
           ],
           My Cat: [
              {...contains be7ea707-19de-43d9-9ef1-d4a3ff79f77a}
           ],
           Something Else: [
              {... contain be7ea707-19de-43d9-9ef1-d4a3ff79f77a} 
           ]
        }
    ]

.groupBy()每个元素只允许一个键,所以不,它不会起作用。 - Pointy
似乎只有 Firefox 支持此功能。 - Pointy
如果一个类别拥有多个项目,预期结果会是什么样子? - Mario Varchmin
这样有什么问题吗?当查找任意类别时,您都想找到父级项目,对吗?您试图获取什么输出? - DustInComp
你能否只是循环原始数组并构建最终结果呢? 此外,我猜相同的category_name可能会出现在多个对象中,因此在某些最终数组中会给你多个对象... - Johan Faerch
1个回答

3
您可以遍历原始数组并创建最终数组:

var data = [{
    "tool_id": "4-19de-454673d9-9ef5-4545",
    "somekey": "Parent Item 2",
    "categoryLookup": [{
      "category_name": "New Item",
    }]
  },
  {
    "tool_id": "be7ea707-19de-43d9-9ef1-d4a3ff79f77a",
    "somekey": "Parent Item",
    "categoryLookup": [{
        "category_name": "My Cat",
      },
      {
        "category_name": "Something Else",
      }
    ]
  }
];

function groupByCategory(data) {
  const res = {};

  data.forEach(item => {
    item.categoryLookup.forEach(category => {
      const name = category.category_name;
      res[name] ??= [];
      res[name].push({
        item: item.tool_id //or all the properties you want
      });
    });
  });
  return res;
}

console.log( groupByCategory(data) );


2
也许应该使用 res[name] ?? []; 代替 @Lee Taylor - RenaudC5
@LeeTaylor请前往编辑历史记录,您会发现是您将其更改为??,在您的编辑之前它是正确的!! - Amir MB
@AmirMB 抱歉,似乎在片段编辑器中单击“整理”按钮会导致这种情况。再次抱歉。 - Lee Taylor
1
@LeeTaylor 不用担心。 - Amir MB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接