如何使用括号为JS对象创建第二级属性

时间:2013-12-04 16:20:34

标签: javascript object-literal

这是合约。我从一个对象字面开始。

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

我做错了什么?

2 个答案:

答案 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;