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

How to update or add value in an array using JavaScript?

本文关键字:数组 添加 何使用 JavaScript 更新      更新时间:2023-09-26

我在JavaScript中使用的变量中有一个数组数组。我想使用子数组更新值,而不必临时复制数组。

下面是一个示例。

我有这个数组

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

我希望能够更改 123 键内a的值(如果存在a)。否则,我想创建该密钥。另外,如果子数组中不存在"a",我想添加它而不是抛出错误。

我正在尝试更新

data['123']['assigned_at'] = 'value';

但由于assigned_at不存在,我收到此错误

无法设置undefinednull引用的属性"assigned_at"。

如何正确更新阵列?

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

你的问题不是assigned_at不存在,而是data['123']不存在,因此未定义。

试试data[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']

所以你的问题是你认为你正在使用哈希图,而实际上你使用的是数组。所以当你写这样的东西时:

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

这将起作用。我认为你只是通过在你的价值观中添加[]而给自己带来了一点困惑。