根据对象的键/值对将对象数组分组

时间:2019-02-05 17:23:19

标签: javascript ecmascript-6

我一直在研究这个问题,我必须根据对象的子属性键/值对对对象数组进行分组。如果设法使它在具有不同键/值的第一个级别(在本例中为“名称”)运行,而在基于包含对象中的数组值的情况下则无法运行。感谢任何帮助!

我想去:

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;
  }, {});

按名称分组展示了它(这显然不是我想要的,但是可以在“第一层”上使用)

2 个答案:

答案 0 :(得分:0)

您可以使用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;
}, []);

答案 1 :(得分:0)

更容易实现

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)