2016-04-12 5 views
0

Мне нужно разделить массив по его значению (типу) объекта. Давайте предположим, что я следующий массив:Как разбить массив объектов на несколько массивов объектов по значению

[ 
    {id:1,name:"John",information: { type :"employee"}}, 
    {id:2,name:"Charles",information: { type :"employee"}}, 
    {id:3,name:"Emma",information: { type :"ceo"}}, 
    {id:4,name:"Jane",information: { type :"customer"}} 
] 

, и я хочу, чтобы разделить объект на information.type поэтому мой конечный результат выглядит следующим образом:

[ 
{ 
    type:"employee", 
    persons: 
    [ 
    {id:1,name:"John",information: { ... }}, 
    {id:2,name:"Charles",information: { ... } 
    ] 
}, 
{ 
    type:"ceo", 
    persons: 
    [ 
    {id:3,name:"Emma",information: { ... }} 
    ] 
}, 
{ 
    type:"customer", 
    persons: 
    [ 
    {id:4,name:"Jane",information: { ... }} 
    ] 
}, 
] 

Подчеркивание доступно в моем проекте. Любая другая вспомогательная библиотека может быть включена.

Конечно, я мог бы пройти через массив и реализовать свою собственную логику, но я искал более чистое решение.

+0

добавьте свое решение. –

ответ

3

Это возвращает именно то, что вы хотите:

_.pairs(_.groupBy(originalArray, v => v.information.type)).map(p => ({type: p[0], persons: p[1]})) 
+1

это чистый блеск. спасибо @ 4lejandrito – ManuKaracho

0

Вы можете использовать groupBy function of underscore.js:

var empList = [ 
{id:1,name:"John",information: { type :"employee"}}, 
    {id:2,name:"Charles",information: { type :"employee"}}, 
    {id:3,name:"Emma",information: { type :"ceo"}}, 
    {id:4,name:"Jane",information: { type :"customer"}} 
]; 
_.groupBy(empList, function(emp){ return emp.information.type; }); 
0

Раствор в простом Javascript с временным объектом для групп.

var array = [{ id: 1, name: "John", information: { type: "employee" } }, { id: 2, name: "Charles", information: { type: "employee" } }, { id: 3, name: "Emma", information: { type: "ceo" } }, { id: 4, name: "Jane", information: { type: "customer" } }], 
 
    result = []; 
 

 
array.forEach(function (a) { 
 
    var type = a.information.type; 
 
    if (!this[type]) { 
 
     this[type] = { type: type, persons: [] }; 
 
     result.push(this[type]); 
 
    } 
 
    this[type].persons.push({ id: a.id, name: a.name }); 
 
}, {}); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

Смежные вопросы