这是合约。我从一个对象字面开始。
var prepObj = {};
然后我会做一个foreach,我会在这个对象中添加属性。基本上,它最终会看起来像这样(在更大的范围内)。
{
34 : {
prop1: myvalue,
prop2: myvalue,
}
87 : {
prop1: myvalue,
prop2: myvalue,
}
102 : {
prop1: myvalue,
prop2: myvalue,
}
}
在整个循环中,我将为某个索引的某个属性(例如prop1 of 87)找到一个值,并为该对象创建它。
所以,在循环之前,我开始使用空白对象。
然后在循环中,我想我能做到:
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
我做错了什么?
答案 0 :(得分:3)
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
;否则它将评估为新对象
答案 1 :(得分:1)
试试这个:
prepObj[index_id] = {};
prepObj[index_id][which_prop] = prop_value;