使用数组生成的对象的奇怪行为[重复]

问题描述 投票:0回答:1

我正在尝试创建一个生成对象,其中充满数组(全部为 0)。

//declaration of the data object
var data = {}

//initiate to fill data with keys and arrays
function init()
{
 var pos = Array.apply(null,Array(16)).map(Number.prototype.valueOf,0); //creates empty array filled with 0
 for(var i = 0; i < 16; i++) {
  data[i] = pos;
 }
}

init();

console.log(data);

这将为我提供一个填充有从 0 到 2 的键的数据,并且每个键都有一个填充有 0 的数组;

{
  '0': [
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0
  ],
  '1': [
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0
  ],
  '2': [
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0
  ]
}

现在,当我尝试像这样修改特定数组时:

data[0][1] = 1;

然后结果会打印所有键中的所有数组都已被修改...

{
  '0': [
    0, 1, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0
  ],
  '1': [
    0, 1, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0
  ],
  '2': [
    0, 1, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0
  ]
}

这对我来说没有意义,因为我只想修改第一个键为 0 的数组... 如果我手动创建整个对象,更改将正常工作,但如果我这样做(生成),我会遇到这个奇怪的错误。 有什么想法吗?

javascript arrays object
1个回答
1
投票

这是因为

data
中的每个键都引用同一个数组。数组是一个对象。当您将对象分配给某个变量或将其作为参数传递时,您只需传递它的引用即可。

为了让你的代码按照你喜欢的方式正确工作,你必须每次都生成新的数组,你想将它分配给数据中的某个键。

const data = {};

for (let i = 0; i < 16; i++) {
  data[i] = new Array(16).fill(0);
}
© www.soinside.com 2019 - 2024. All rights reserved.