Группирование записей объектов в массивы объектов - PullRequest
0 голосов
/ 29 мая 2020

Как я могу создавать массивы для членов группы в зависимости от их tag?

Теги могут быть любыми, это просто примеры.

Пример ввода

[
  { tag: 'Red', member: 'Red-Steve' },
  { tag: 'Red', member: 'Red-Adam' },
  { tag: 'Blue', member: 'Blue-John' },
  { tag: 'Blue', member: 'Blue-James' },
  { tag: 'Blue', member: 'Blue-Igor' }
]

Пример вывода

{
  Red: ['Red-Steve', 'Red-Adam']
  Blue: ['Blue-John', 'Blue-James', 'Blue-Igor']
}

Изменить: я только что сделал тестовый пример на jsperf, чтобы сравнить эффективность различных ответов, а также ответ из предложенного повторяющегося вопроса https://jsperf.com/group-objects-reduce-vs-for-loop

Ответ от @Majed Badawi был самым эффективным

Ответы [ 4 ]

1 голос
/ 29 мая 2020

Следующий код сделает то, что вы просите. Он использует синтаксис object [variableKey], чтобы получить то, что вы ищете.

const members=[
  { tag: 'Red', member: 'Red-Steve' },
  { tag: 'Red', member: 'Red-Adam' },
  { tag: 'Blue', member: 'Blue-John' },
  { tag: 'Blue', member: 'Blue-James' },
  { tag: 'Blue', member: 'Blue-Igor' }
]

//this will be the output object
const newObj={};

for(memberObj of members){
    const newKey = memberObj.tag;

    //if the key already existed, just add the new item to the existing array
    if(newObj[newKey]){newObj[newKey].push(memberObj.member);}
    //if the key didn't exist, create an array value for it with the new object
    else{newObj[newKey]=[memberObj.member];}
}

console.log(newObj);
1 голос
/ 29 мая 2020

собрать в карту объектов, используя тег в качестве ключа и добавив в массив

d=[
  { tag: 'Red', member: 'Red-Steve' },
  { tag: 'Red', member: 'Red-Adam' },
  { tag: 'Blue', member: 'Blue-John' },
  { tag: 'Blue', member: 'Blue-James' },
  { tag: 'Blue', member: 'Blue-Igor' }
]
console.log(
d.reduce((acc,{tag,member})=>({...acc, [tag]: [...acc[tag]||[], member]}),{})
)
1 голос
/ 29 мая 2020

Вы можете использовать простой set, чтобы сгруппировать их по tag следующим образом:

let list = [
            { tag: 'Red', member: 'Red-Steve' },
            { tag: 'Red', member: 'Red-Adam' },
            { tag: 'Blue', member: 'Blue-John' },
            { tag: 'Blue', member: 'Blue-James' },
            { tag: 'Blue', member: 'Blue-Igor' }
];
let set = {};
for(let i = 0; i < list.length; i++){
     let current = list[i];
     if(!set[current.tag])
          set[current.tag] = [current.member];
     else
          set[current.tag].push(current.member);
}
console.log(set);
0 голосов
/ 29 мая 2020

Я думаю, что это будет хороший способ добиться этого в современном синтаксисе. Но могут быть и агрегатные функции.

var arr = [
  { tag: 'Red', member: 'Red-Steve' },
  { tag: 'Red', member: 'Red-Adam' },
  { tag: 'Blue', member: 'Blue-John' },
  { tag: 'Blue', member: 'Blue-James' },
  { tag: 'Blue', member: 'Blue-Igor' }
];

var newArr = [];
arr.forEach(o => {
  var existing = newArr[o.tag] && newArr[o.tag].length > 0 ? newArr[o.tag] : [];
  newArr[o.tag] = [...existing, ...[o.member]];
});

console.log('newArr', newArr);

В Chrome он дает следующий вывод в консоли

Chrome Console Output

У нас есть аналогичный вопрос здесь Самый эффективный метод группировки по массиву объектов

...