在Javascript中初始化嵌套关联数组

时间:2013-11-25 21:14:52

标签: javascript arrays

我有一个具有以下结构的关联数组

[location] [product]然后[count]和[date] leaf entries

我正在尝试使用下面的代码初始化它

summary = {};
if(location in summary == false && product in summary == false){
        summary[location][product] = {};
}

然后迭代销售对象并使用

分配值
summary[location][product]["count"] = count;
summary[location][product]["date"] = countDate;

但我收到以下错误,我错过了什么

Type Error: summary[location] is undefined 

3 个答案:

答案 0 :(得分:2)

您需要随时定义每个嵌套对象。而不是

summary = {};
if(location in summary == false && product in summary == false) {
    summary[location][product] = {};
}

您需要输入

summary = {}

if (!(location in summary)
    summary[location] = {}

if (!(product in summary[location]))
    summary[location][product] = {}

summary[location][product]['count'] = count
summary[location][product]['date'] = countdate

这将删除错误。

我可能还有一种更有效的方式,但我确信这是有效的。

答案 1 :(得分:1)

问题在于您的代码:

summary = {};
if(location in summary == false && product in summary == false) {
    summary[location][product] = {};
}

永远不会设置产品,因为如果位置不在摘要中,那么您将无法使用以下设置产品:

summary[location][product]

因为您无法设置 null (位置)

的产品属性

稍后当您尝试使用以下命令访问location属性时

<强>概要[位置] [产物]

同样的问题发生了。位置为空,您无法访问其属性“product”。

P.S。如果位置和属性不是变量,则必须使用“位置”或“产品”

等引号

答案 2 :(得分:1)

您的代码存在的问题是您无法同时按名称分配多个级别的未定义或空对象成员,因此类似这样的内容将失败:

var obj = {};
obj.member.member = someValue; // Will fail

要解决此问题,您可以在使用之前使用对象文字始终初始化对象的“骨架”。这样您就可以避免必须逐级初始化对象。

summary = {"location": {"product": {}}};