如何使用JavaScript在数组中更新或添加值?

如何使用JavaScript在数组中更新或添加值?,javascript,arrays,Javascript,Arrays,我在JavaScript中使用的变量中有一个数组数组。我想用子数组更新值,而不必临时复制数组 这里有一个例子 我有这个数组 var data= [{ '123': [{'a': 10, 'b': 20, 'c': 30, 'd': 40}], '456': [{'a': 1, 'b': 2, 'c': 3, 'd': 4}] }]; 如果a存在,我希望能够在123键内更改a的值。否则,我要创建该键。另外,如果子数组中不

我在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';
但由于分配的_at不存在,我得到了这个错误

无法设置
undefined
null
引用的属性“assigned_at”

如何正确更新阵列

var数据=[{
'123': [{
“a”:10,
“b”:20,
“c”:30,
d:40
}],
'456': [{
"a":1,,
“b”:2,
"c":3,,
d:4
}]
}];

数据['123']['assigned_at']='value'您的问题不在于
处分配的\u不存在,而是
数据['123']
不存在,因此未定义

请尝试
数据[0]['123']


顺便说一句:你似乎不理解数组和/或对象,因为你在每个数组中都放了一个对象。

你的问题不是分配给
不存在,而是
数据['123']
不存在,因此没有定义

请尝试
数据[0]['123']


顺便说一句:您似乎不理解数组和/或对象,因为您在每个数组中都放置了一个对象。

您可能需要最简单的数据形式,在本例中为JSON,因此不需要括号:

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']

在本例中,您可能需要最简单的数据形式,即JSON,因此不需要括号:

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']

所以你们的问题是,你们认为你们在使用一个hashmap,而实际上你们在使用一个数组。因此,当你写一些类似于:

var data= [{
         '123':  [{'a': 10, 'b': 20, 'c': 30, 'd': 40}],
         '456':  [{'a': 1, 'b': 2, 'c': 3, 'd': 4}]
      }];

console.log(data["123"])
您将得到一个错误,因为您试图用字符串索引数组。通过查看
数据
对象可以看到,它是一个包装哈希映射的数组(实际上不需要)。如果你真的要正确使用这个对象,你需要写

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"])
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
它将打印
[{'a':10,'b':20,'c':30,'d':40}]

如果您想将一个新键分配到
数据[0][“123”]
,因为您也将值包装在数组中,所以需要编写

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"])
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

这会管用的。我认为您只是因为在值中添加了
[]
而给自己造成了一点混乱。

所以您的问题是,您认为自己在使用hashmap,而实际上您正在使用数组。因此,当你写一些类似于:

var data= [{
         '123':  [{'a': 10, 'b': 20, 'c': 30, 'd': 40}],
         '456':  [{'a': 1, 'b': 2, 'c': 3, 'd': 4}]
      }];

console.log(data["123"])
您将得到一个错误,因为您试图用字符串索引数组。通过查看
数据
对象可以看到,它是一个包装哈希映射的数组(实际上不需要)。如果你真的要正确使用这个对象,你需要写

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"])
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
它将打印
[{'a':10,'b':20,'c':30,'d':40}]

如果您想将一个新键分配到
数据[0][“123”]
,因为您也将值包装在数组中,所以需要编写

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"])
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

这会管用的。我想你只是把
[]
添加到你的值中给自己造成了一点混乱。

看来
数据
是一个包含单个对象的数组,该数组反过来包含键
123
456
。那是打字错误吗?Oh和
123
456
同样是只有一个对象的数组-因此完整路径应该是:
data[0][123][0][a][a”
看起来
data
是一个包含单个对象的数组,该数组反过来包含键
123
456
。那是打字错误吗?哦,和
123
456
同样是只有一个对象的数组-因此完整路径应该是:
data[0][123][0][a][a”
对不起,我想我的示例把一切都抛在脑后了。下面是我如何定义数组var data=[];然后我向它添加一个键和数组数据['123']['assigned_at']='value'。我希望这能更好地解释我想做的事情。PS:data[0]['123']现在仍在工作。@MikeA你问一下你的问题,而不是说你有一些你真的没有的东西,怎么样?当你这么做的时候,创建一个MCVESorry,我想我的例子就是抛开一切。下面是我如何定义数组var data=[];然后我向它添加一个键和数组数据['123']['assigned_at']='value'。我希望这能更好地解释我想做的事情。PS:data[0]['123']现在仍在工作。@MikeA你问一下你的问题,而不是说你有一些你真的没有的东西,怎么样?当你这样做的时候,创建一个MCVE