我在JavaScript中使用变量中的数组。我想用子数组更新一个值,而不必临时复制数组。
这是一个例子。
我有这个数组
var data= [{
'123': [{'a': 10, 'b': 20, 'c': 30, 'd': 40}],
'456': [{'a': 1, 'b': 2, 'c': 3, 'd': 4}]
}];
如果a
存在,我希望能够更改123键内a
的值。否则,我想创建该密钥。此外,如果' a'在子数组中不存在,我想添加它而不是抛出错误。
我正在尝试更新
data['123']['assigned_at'] = 'value';
但由于assigned_at不存在,我收到此错误
无法设置属性" assigned_at'未定义或空引用。
如何正确更新数组。
答案 0 :(得分:6)
问题不在于assigned_at
不存在,而是data['123']
不存在,因此未定义。
尝试data[0]['123']
。
BTW:你似乎不理解数组和/或对象,因为你在每个数组中都放了一个对象。
答案 1 :(得分:5)
在这种情况下,你可能想要最简单的数据形式,因此括号是不必要的:
var data= {
'123': {'a': 10, 'b': 20, 'c': 30, 'd': 40},
'456': {'a': 1, 'b': 2, 'c': 3, 'd': 4}
};
现在你可以得到这样的项目:
data['123'];
// and the nested objects:
data['123']['a'];
你所拥有的是一个包含一个JSON元素的数组,所以你可以使用以下代码获得它:
data[0]['123']
// and for the nested objects:
data[0]['123'][0]['a']
答案 2 :(得分:2)
因此,您遇到的问题是您认为在使用数组时实际使用的是散列映射。所以当你写下这样的东西时:
var data= [{
'123': [{'a': 10, 'b': 20, 'c': 30, 'd': 40}],
'456': [{'a': 1, 'b': 2, 'c': 3, 'd': 4}]
}];
console.log(data["123"])
您将收到错误,因为您尝试使用字符串索引数组。正如您通过查看data
对象所看到的那样,它是一个包装哈希映射的数组(这实际上是不必要的)。如果您真的要正确使用此对象,则需要编写
var data= [{
'123': [{'a': 10, 'b': 20, 'c': 30, 'd': 40}],
'456': [{'a': 1, 'b': 2, 'c': 3, 'd': 4}]
}];
console.log(data[0]["123"])
将打印[{'a': 10, 'b': 20, 'c': 30, 'd': 40}]
。
如果您想将新密钥分配到data[0]["123"]
,因为您也将值包装在数组中,您需要编写
var data= [{
'123': [{'a': 10, 'b': 20, 'c': 30, 'd': 40}],
'456': [{'a': 1, 'b': 2, 'c': 3, 'd': 4}]
}];
data[0]["123"][0]["assigned_at"] = 52 //or w/e you want here
我建议放弃[]
包围你的价值观,然后写下
var data= {
'123': {'a': 10, 'b': 20, 'c': 30, 'd': 40},
'456': {'a': 1, 'b': 2, 'c': 3, 'd': 4}
};
data["123"]["assigned_at"] = 52 //or w/e
哪个会奏效。我认为你只是通过在你的价值观中添加[]
而让自己有点混乱。