Фильтрация и объединение индексов в массиве объектов с одним и тем же свойством - PullRequest
1 голос
/ 16 мая 2019

Попытка выяснить, как лучше всего использовать один массив объектов в JS и объединить свойства его индексов на основе значения общего свойства.

По сути, у меня есть массив пользователей, которые применилик определенному классу, где класс, к которому пользователь применил, является массивом.Однако каждый отдельный класс, к которому обратился тот же пользователь, имеет свой отдельный индекс.Цель состоит в том, чтобы объединить все пользовательские классы в одном индексе (массиве) вместо дубликатов.

Пример.

let someArray = [
    {
        name: 'Jim',
        class: [
            {
                name: 'Sports Journalism',
                field: 'Journalism'
            }
        ]
    },
    {
        name: 'Pam',
        class: [
            {
                name: 'Fine Arts',
                field: 'Art'
            }
        ]
    },
    {
        name: 'Jim',
        class: [
            {
                name: 'Sales 101',
                field: 'Business'
            }
        ]
    }
]
// something like this where we would want all of Jim's
// classes to be in one class array on just one index

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Использование reduce:

let someArray = [{name:'Jim',class:[{name:'Sports Journalism',field:'Journalism'}]},{name:'Pam',class:[{name:'Fine Arts',field:'Art'}]},{name:'Jim',class:[{name:'Sales 101',field:'Business'}]}];
const res = Object.values(someArray.reduce((acc, { name, class: [...classObj] }) => {
  (acc[name] = acc[name] || { name, class: [] }).class.push(classObj);
  return acc;
}, {}));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
0 голосов
/ 16 мая 2019

Вот группа по функциям, которая выполнит работу для всех похожих имен пользователей:

function groupBy(data, fields, sumBy='class') {
  let r=[], cmp= (x,y) => fields.reduce((a,b)=> a && x[b]==y[b], true);
  data.forEach(x=> {
    let y=r.find(z=>cmp(x,z));
    let w= [...fields,sumBy].reduce((a,b) => (a[b]=x[b],a), {})
    y ? y[sumBy]=[...y[sumBy], ...x[sumBy]] : r.push(w);
  });
  return r;
}

И вы можете использовать его так:

let oh = groupBy(someArray, ['name']);

Вдохновленный этим вопросом: Наиболее эффективный метод группирования по массиву объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...