簡體   English   中英

根據對象的鍵/值對將對象數組分組

[英]Group array of objects based on the object's key/value-pair which is in an array

我一直在研究這個問題,我必須根據對象的子屬性鍵/值對對對象數組進行分組。 如果設法使它在具有不同鍵/值的第一個級別(在本例中為“名稱”)運行,而在基於包含對象中的數組值的情況下則無法運行。 感謝任何幫助!

我想從:

let array = [
    {name: 'Name1', classes: [
        {className: 'class1'}, {className: 'class2'}
    ]}, 
    {name: 'Name2', classes: [
        {className: 'class1'}
    ]}, 
    {name: 'Name3', classes: [
        {className: 'class2'}
    ]}
];

變成類似:

let resultArray = [
    {
      class1: [
        { name: 'Name1', classes: [{ className: 'class1' }, { className: 'class2' }] },
        { name: 'Name2', classes: [{ className: 'class1' }] }
      ]
    },
    {
      class2: [
        { name: 'Name1', classes: [{ className: 'class1' }, { className: 'class2' }] },
        { name: 'Name3', classes: [{ className: 'class2' }] }
      ]
    }
  ];

編輯:對不起,沒有添加最小,完整和可驗證的示例。 我以前的經歷是:

const groupByKey = (arr) =>
  arr.reduce((r, v, i, a, k = v.name) => {
    const rTemp = r;
    rTemp[k] = rTemp[k] ? rTemp[k] : [];
    rTemp[k].push(v);
    return rTemp;
  }, {});

將其按名稱分組顯示(這顯然不是我想要的,但可以在“第一級”上使用)

您可以使用reduce

array.reduce((acc, curr) => {
  curr.classes.forEach(cls => {
    if(acc[cls.className]) {
      acc[cls.className].push(curr);
    } else {
      acc[cls.className] = [curr];
    }
  })
  return acc;
}, []);

實施更容易

 let array = [ { name: 'Name1', classes: [ { className: 'class1' }, { className: 'class2' } ] }, { name: 'Name2', classes: [ { className: 'class1' } ] }, { name: 'Name3', classes: [ { className: 'class2' } ] } ]; let resultArray = [] array.forEach(function (element) { element.classes.forEach(function (innerelement) { if (!resultArray[innerelement.className]) resultArray[innerelement.className] = [] resultArray[innerelement.className].push(element); }) }) console.log(resultArray) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM