#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);