2014-05-25 26 views
1

我試圖創造一些像通過推送變量創建對象數組?

var[1] = {object1, object2}; 
var[2] = {object1, object3); 

或者類似的東西,讓我可以在每個結果循環並取得與該關鍵字相關聯的所有對象。問題是我要麼真的嘗試過或者因爲我似乎無法弄清楚如何做到這一點。

在PHP中我會做類似

$var[$object['id']][] = object1; 
$var[$object['id']][] = object2; 

我怎樣才能做這樣的事情在Javascript?

我有一個對象元素的列表,它有一個名爲id的鍵值,我想用ID來組織它們。基本上...

[0] = { id: 2 }, 
[1] = { id: 3 }, 
[2] = { id: 2 }, 
[3] = { id: 3 } 

我想有他們組織起來就好似

[0] = { { id: 2 }, { id: 2 } } 
[1] = { { id: 3 }, { id: 3} } 

回答

2
var indexedArray = []; 

for(var key in myObjects) { 

    var myObject = myObjects[key]; 

    if(typeof(indexedArray[myObject.id]) === 'undefined') { 
     indexedArray[myObject.id] = [myObject]; 
    } 
    else { 
     indexedArray[myObject.id].push(myObject); 
    } 
} 

console.log(indexedArray); 

http://jsfiddle.net/2fr4k/

+0

幾件事情要小心使用此解決方案:如果'id'不是0的整數到2^32 - 1(比如說'-1'),或者如果'id's不是從'0'順序運行,那麼你最終會得到一個稀疏數組。 – Xotic750

+0

另外,在數組上使用'for..in'時要小心。 http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-such-a-bad-idea – Xotic750

1

陣列是用方括號定義:

var myArray = [{ "id": 2 }, { "id": 3 }]; 

你有什麼不是有效的語法。

0

使用ECMA5方法,你可以做這樣的事情。

的Javascript

var d1 = [{ 
     id: 2 
    }, { 
     id: 3 
    }, { 
     id: 2 
    }, { 
     id: 3 
    }], 
    d2; 


d2 = d1.reduce(function (acc, ele) { 
    var id = ele.id; 

    if (!acc[id]) { 
     acc[id] = []; 
    } 

    acc[id].push(ele); 

    return acc; 
}, {}); 

d2 = Object.keys(d2).map(function (key) { 
    return this[key]; 
}, d2); 

console.log(JSON.stringify(d2)); 

輸出

[[{"id":2},{"id":2}],[{"id":3},{"id":3}]] 

jsFiddle