2013-02-04 42 views
20

說我有一個這樣的數組:打破對象到基於的屬性單獨的數組的數組

var arr = [ 
    {type:"orange", title:"First"}, 
    {type:"orange", title:"Second"}, 
    {type:"banana", title:"Third"}, 
    {type:"banana", title:"Fourth"} 
]; 

,我想這被分裂成具有具有相同類型,以便對象數組:

[{type:"orange", title:"First"}, 
{type:"orange", title:"Second"}] 

[{type:"banana", title:"Third"}, 
{type:"banana", title:"Fourth"}] 

但我想這樣做,所以一般沒有if語句指定橙或香蕉

// not like this 
for (prop in arr){ 
    if (arr[prop] === "banana"){ 
     //add to new array 
    } 
} 

想法? JQuery和Underscore都是使用的選項。

+0

感謝您的真正有益的迴應。改變了等號。 – Evan

回答

6

這是假設對象的數組:

function groupBy(array, property) { 
    var hash = {}; 
    for (var i = 0; i < array.length; i++) { 
     if (!hash[array[i][property]]) hash[array[i][property]] = []; 
     hash[array[i][property]].push(array[i]); 
    } 
    return hash; 
} 

groupBy(arr,'type') // Object {orange: Array[2], banana: Array[2]} 
groupBy(arr,'title') // Object {First: Array[1], Second: Array[1], Third: Array[1], Fourth: Array[1]} 
7

簡單的建造持有根據他們的標題對象的字典。你可以做這樣的:

JS

var arr = [ 
{type:"orange", title:"First"}, 
{type:"orange", title:"Second"}, 
{type:"banana", title:"Third"}, 
{type:"banana", title:"Fourth"} 
]; 
var sorted = {}; 
for(var i = 0, max = arr.length; i < max ; i++){ 
if(sorted[arr[i].type] == undefined){ 
    sorted[arr[i].type] = []; 
} 
sorted[arr[i].type].push(arr[i]); 
} 
console.log(sorted["orange"]); 
console.log(sorted["banana"]); 

的jsfiddle演示:http://jsfiddle.net/YJnM6/

+0

偉大的作品,也稱爲模式字典的榮譽! –

19

這是Array.reduce(...)一件容易的事:

function groupBy(arr, property) { 
    return arr.reduce(function(memo, x) { 
    if (!memo[x[property]]) { memo[x[property]] = []; } 
    memo[x[property]].push(x); 
    return memo; 
    }, {}); 
} 

var o = groupBy(arr, 'type'); // => {orange:[...], banana:[...]} 
o.orange; // => [{"type":"orange","title":"First"},{"type":"orange","title":"Second"}] 
o.banana; // => [{"type":"banana","title":"Third"},{"type":"banana","title":"Fourth"}] 

當然,如果你的目標瀏覽器( s)不支持ECMAScript 262第5版,那麼您必須自己實現「減少」,或使用polyfill庫,或選擇其他答案。

[更新]下面是應該使用JavaScript的任何版本的解決方案:

function groupBy2(xs, prop) { 
    var grouped = {}; 
    for (var i=0; i<xs.length; i++) { 
    var p = xs[i][prop]; 
    if (!grouped[p]) { grouped[p] = []; } 
    grouped[p].push(xs[i]); 
    } 
    return grouped; 
} 
+0

可能還希望包含符合更多瀏覽器的版本。 IE8不支持'reduce'。 –

+0

@TravisJ:是的,如果您的目標瀏覽器不支持EMCAScript 262第5版,那麼您需要實現自己的「減少」功能或選擇其他答案之一。 – maerics

相關問題