这是交易。我从对象文字开始。

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]最初未定义。因此,您试图在prop1prepObj[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;否则将评估为一个新对象

09-25 19:57