2012-01-12 39 views
1

我想动态地创建一个形式的对象 - {“abc”:[x1,x2],“efg”:[x3,x4,x1]} 以下代码不是工作......这里有什么问题?JavaScript对象键和数值作为数组

var catCmp = {}; 
var x1="abc"; 
var x2="efg"; 

var y1="x1"; 
var y2="x2"; 
var y3="x3"; 
var y4="x4"; 

if (typeof catCmp[x1] === 'undefined') { 
    catCmp[x1] = []; 
} 
if (typeof catCmp[x2] === 'undefined') { 
    catCmp[x2] = []; 
} 

catCmp[x1] = catCmp[x1].push(y1); 
catCmp[x1] = catCmp[x1].push(y2); 
catCmp[x2] = catCmp[x2].push(y3); 
catCmp[x2] = catCmp[x2].push(y4); 
catCmp[x2] = catCmp[x2].push(y1); 

console.log('catCmp :::', catCmp); 
+0

你为什么这样做'catCmp [X1] = catCmp [X1] .push(Y1);',而不是'catCmp [X1] .push(Y1);'? – 2012-01-12 07:08:46

+0

感谢所有的指针,特别是“推新方法返回新对象的长度”。 – user644745 2012-01-12 09:31:49

回答

6

您不需要分配推送操作的结果。你可以简单地调用catCmp[x1].push(y1);

+1

不仅仅是你不需要,实际上你不应该,因为push方法返回新对象的长度。 – riship89 2012-01-12 07:17:34

+2

是的,你不应该。我只是用一种很好的方式说出来! :-) – techfoobar 2012-01-12 07:19:22

0
catCmp[x1].push(y1); 
catCmp[x1].push(y2); 
catCmp[x2].push(y3); 
catCmp[x2].push(y4); 
catCmp[x2].push(y1); 
3

在行:

catCmp[x1] = catCmp[x1].push(y1); 

catCmp[x1].push(y1)返回的值是y1值。所以这是分配给catCmp[x1]的值。

在其他的答案建议,不做作业,只是做:

catCmp[x1].push(y1); 
0

JavaScript push method返回赖以推方法被调用该对象的新长度。

所以,你的情况,声明

catCmp[x1] = catCmp[x1].push(y1); 

使得catCmp [X1] = catCmp [X1]。长度

不只是你不需要,你不应该分配回推的结果操作。因此,只需使用:

catCmp[x1].push(y1);