我正在尝试创建一个生成对象,其中充满数组(全部为 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 的数组... 如果我手动创建整个对象,更改将正常工作,但如果我这样做(生成),我会遇到这个奇怪的错误。 有什么想法吗?
这是因为
data
中的每个键都引用同一个数组。数组是一个对象。当您将对象分配给某个变量或将其作为参数传递时,您只需传递它的引用即可。
为了让你的代码按照你喜欢的方式正确工作,你必须每次都生成新的数组,你想将它分配给数据中的某个键。
const data = {};
for (let i = 0; i < 16; i++) {
data[i] = new Array(16).fill(0);
}