Группировать массив объектов на основе пары ключ / значение объекта, которая находится в массиве - PullRequest
0 голосов
/ 05 февраля 2019

Я действительно решил эту проблему, когда мне нужно сгруппировать массив объектов на основе пар ключ / значение свойства объекта.Если удалось заставить его работать, если он находится на первом уровне с отличным ключом / значениями (в данном случае «name»), но не тогда, когда он основан на значениях массива в содержащем объекте.Цени любую помощь!

Я хочу перейти от:

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' }] }
      ]
    }
  ];

Редактировать: извините, не добавил пример Minimal, Complete и Verifiable,То, что у меня было раньше, было:

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 голосов
/ 05 февраля 2019

Упрощенная реализация

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)
0 голосов
/ 05 февраля 2019

Вы можете использовать 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;
}, []);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...