这是交易。我从对象文字开始。
var prepObj = {};
然后,我将在foreach中向该对象添加属性。基本上,最终它将看起来像这样(更大范围)。
{
34 : {
prop1: myvalue,
prop2: myvalue,
}
87 : {
prop1: myvalue,
prop2: myvalue,
}
102 : {
prop1: myvalue,
prop2: myvalue,
}
}
在整个循环中,我将为某个索引的某个属性(例如87的prop1)找到一个值,并为该对象创建它。
因此,在循环之前,我从一个空白对象开始。
然后在循环中,我想我可以做:
var index_id = 87;
var which_prop = "prop1";
var prop_value = "This is a value.";
prepObj[index_id][which_prop] = prop_value;
但是当我尝试这样做时,我收到一条错误消息:
Uncaught TypeError: Cannot set property 'prop1' of undefined
我究竟做错了什么?
最佳答案
JavaScript不支持autovivication。必须先定义prepObj[index_id] = {}
,然后再定义prepObj[index_id][which_prop] = prop_value
。
这是因为prepObj[index_id]
最初未定义。因此,您试图在prop1
的prepObj[index_id]
上设置undefined
属性。通过为prepObj[index_id]
定义一些值可以避免这种情况。
如果您担心每次都用新对象破坏prepObj[index_id]
,则可以通过以下任一方法测试该值是否已设置:index_id in prepObj
-测试prepObj已经有一个键值为index_id
的条目typeof prepObj[index_id] != "undefined"
-测试prepObj[index_id]
的值是否不是undefined
prepObj[index_id] || {}
-如果它不是伪造的值(例如prepObj[index_id]
),则结果为undefined
;否则将评估为一个新对象