2014-05-25 27 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