2013-11-24 81 views
1

我有一些數據underscore.js GROUPBY子陣列

var data = [ 
    {type: "A", role:[1,2]}, 
    {type: "B", role:[2]}, 
    {type: "C", role:[2,3]}, 
    {type: "D", role:[3]} 
]; 

我想sortBy '角色' 使用underscore.js

var groups = _(data).groupBy(function(el){ 
    return el.role 
    } 
); 

有沒有一種簡單的方法來獲得reapeated數據這樣

1: { 
    {type:"A" ...} 
}, 
2: { 
    {type:"A" ...}, 
    {type:"B" ...}, 
... etc 

不喜歡這個http://jsbin.com/IzEwUkim/2/edit

回答

5

您可以像往常一樣,做手工用_.reduce,像這樣:

var groups = _(data).reduce(function(memo, o) { 
    _(o.role).each(function(i) { 
     memo[i] = memo[i] || [ ]; 
     memo[i].push(o); 
    }); 
    return memo; 
}, { }); 

演示:http://jsfiddle.net/ambiguous/HDE3c/

你可以使用一個簡單的for循環,而不是_.each遍歷過程中的作用。

_.groupBy不會在這裏工作,因爲函數/鍵總是單個值,所以我認爲你被卡在手工解開role陣列。

+0

這是非常有益的,偉大的:) – D3vilroot

1

我知道你要的底線,但這裏的原生JS:

var map = {}; 
data.forEach(function(obj){ 
    obj.role.forEach(function(roleVal){ 
    (map[roleVal] = map[roleVal] || []).push(obj); 
    }); 
}); 
console.log(map); 
+0

你也可以使用本機['reduce'(HTTPS://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce),如果你想跳過單獨的'var map = {}'。原生解決方案沒有錯。 –