2013-10-28 130 views
0

我正在尝试设置某个对象的属性,但我有时会收到此错误:添加属性对象

Uncaught TypeError: Cannot read property '4' of undefined

代码:

var obj = {}; 

obj['fields'][4]['name'] = value; 

是,4个不存在的,但为什么它没有创建?

+0

obj.fields还不存在。您需要先设置该属性(大概是数组),然后才能访问其中的第5个项目。 – Sampson

+0

1.哪个语句出错? 2.如果没有定义obj.fileds,'obj ['fields'] [4] ['name'] = value'上升错误 –

回答

8

其实,它告诉你obj['fields']是未定义的。不,它不会自动为您创建嵌套。

var obj = {}; 
obj['fields'] = {}; 
obj['fields'][4] = {}; 
obj['fields'][4]['name'] = value; 

当与物体的工作,如果你不能确定它是否有它的嵌套已经(和你不希望如果它不覆盖它),你可以做到以下几点:

obj['fields'] = obj['fields'] || {} 
obj['fields'][4] = obj['fields'][4] || {}; 
//etc 

要检查未定义:

if(!obj['fields']){} // undefined returns falsey 
//or 
if('fields' in obj == false){} // notice you can't lead with ! here 
//or 
if(obj['fields'] === undefined){} // note the triple === 
+0

哇,太糟糕了。在PHP他们将被创建:/我如何检查属性是否存在,所以我不覆盖它们? – thelolcat

+0

@thelolcat更新了我的答案来回答你的问题 – Matt

1

你必须首先初始化的属性:

var obj = {}; 

obj['fields'] = new Array(); 
obj['fields'][4] = new Array(); 
obj['fields'][4]['name'] = value; 
+1

如果意图是将字符串属性分配给对象,我不会为'obj ['fields'] [4]'对象使用数组。取决于你如何使用它,它可能仍然有效 - 但一个普通的{}对象可能会更好。 – Matt

+0

确实。事实上,有很多方法可以实现它。这只是我想到的第一个:P。 – Carlos

0

试图读取不存在的属性不会创建它。出现错误的确切原因是尝试访问fields返回undefined,并且无法访问undefined值中的任何属性。

要设置的值,你需要创建所有的父母:

obj.fields = []; 
obj.fields[4] = {}; 
obj.fields[4].name = value;