Цепочка Lodash и groupBy

#javascript #lodash

#javascript #Lodash

Вопрос:

Иметь массив

 var list = [
    {id: 1, name: 'name1', type: 'type1'},
    {id: 2, name: 'name2', type: 'type1'},
    {id: 3, name: 'name3', type: 'type1'},
    {id: 4, name: 'name4', type: 'type2'},
    {id: 5, name: 'name5', type: 'type3'},
    {id: 6, name: 'name6', type: 'type3'}
];
  

Как мне получить следующее:

 var obj = {
type1: {
    1: {id: 1, name: 'name1', type: 'type1'},
    2: {id: 2, name: 'name2', type: 'type1'},
    3: {id: 3, name: 'name3', type: 'type1'}
},
type2: {
    4: {id: 4, name: 'name4', type: 'type2'}
},
type3: {
    5: {id: 5, name: 'name5', type: 'type3'},
    6: {id: 6, name: 'name6', type: 'type3'}
}
};
  

Я пытался:

 _.chain(list).groupBy('type').value();
  

Но получилось только разбить массив типа.

Ответ №1:

Вы можете использовать reduce() для этого чистый js.

 var list = [
    {id: 1, name: 'name1', type: 'type1'},
    {id: 2, name: 'name2', type: 'type1'},
    {id: 3, name: 'name3', type: 'type1'},
    {id: 4, name: 'name4', type: 'type2'},
    {id: 5, name: 'name5', type: 'type3'},
    {id: 6, name: 'name6', type: 'type3'}
];

var result = list.reduce(function(r, e, i) {
  if(!r[e.type]) r[e.type] = {}
  r[e.type][i 1] = e;
  return r;
}, {})

console.log(result)  

Комментарии:

1. Обновил мой ответ.

Ответ №2:

Возможно, вы можете сделать следующее;

 var list = [
    {id: 1, name: 'name1', type: 'type1'},
    {id: 2, name: 'name2', type: 'type1'},
    {id: 3, name: 'name3', type: 'type1'},
    {id: 4, name: 'name4', type: 'type2'},
    {id: 5, name: 'name5', type: 'type3'},
    {id: 6, name: 'name6', type: 'type3'}
    ],

  result = list.reduce((p,c) => (p[c.type] === undefined ? p[c.type] = {[c.id]: c}
                                                         : p[c.type][c.id] = c, p), {});
console.log(result);