2014-12-03 3 views
0

У меня есть массив идентификаторов и организаций, как так:Group по идентификатору объекта годов в Javascript

var ids = ['1','2', '3']; 
var orgs = 
    [ 
     { name: "Org 1", id: 1 }, 
     { name: "Org 2", id: 2 }, 
     { name: "Org 3", id: 2 } 
    ] 

Я хочу перебрать их на выходе что-то вроде этого:

{ 
    1: [ 
     {name: "Org 1", id: 1} 
    ], 
    2: [ 
     {name: "Org 2", id: 2}, 
     {name: "Org 3", id: 2} 
    ] 
} 

Я попытался это без успех:

var results = orgs.forEach(function (org) { 
    if (results[org.id]) { 
     results.push(org) 
    } else { 
     results[org.id] = [org] 
    }; 
}); 
+0

Вашего 'results' является * недействительной * структурой. '{[]}' неверно, вы не можете иметь объект без ключей. –

+0

Спасибо @RocketHazmat - я думаю, что я обновил соответственно. – Anthony

ответ

2

Если вы не хотите использовать библиотеку как подчёркивания Ramda или Lo-тир, то это достаточно просто написать это с помощью reduce:

var results = orgs.reduce(function(results, org) { 
    (results[org.id] = results[org.id] || []).push(org); 
    return results; 
}, {}) 
+0

Спасибо Скотту - именно то, что я ищу. – Anthony

+0

Но обратите внимание, что библиотеки также упрощают это. С помощью [Ramda] (http://ramdajs.com/) вы можете просто выполнить команду R.groupBy (R.prop ('id'), orgs); '. И если вы хотите использовать функцию многократного использования, это будет просто 'var groupById = R.groupBy (R.prop ('id'));'. Lo-Dash и Underscore предлагают довольно схожие функции. –

0

вы должны использовать underscore и просто вернуть идентификатор

http://underscorejs.org/#groupBy

_.groupBy ([1,3, 2,1, 2,4], функция (число) {вернуть Math.floor (NUM); }); => {1: [1,3], 2: [2,1, 2,4]}

вы также можете взглянуть на lo-dash

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