我在本网站上看到的所有例子都表明我应该能够做到这一点:
var multiArray = []
var singleArray = []
singleArray[0] = "10"
singleArray[1] = "11"
multiArray.push(singleArray)
singleArray[0] = "20"
singleArray[1] = "21"
multiArray.push(singleArray)
我希望multiArray包含:
["10", "11"]["20", "21"}
实际上它包含:
["20", "21"]["20", "21"}
看起来好像multiArray持有对singleArray的引用而不是数据。因此,更改singleArray的内容会影响multiArray中的两个条目。
我是否犯了一个非常基本的错误,或者是否有一些解决方法?
感谢您的帮助。
答案 0 :(得分:1)
你没有推送数组的副本。您正在将引用的副本推送到阵列。由于副本都指向同一个数组,因此您会看到它两次。
你可以这样做:
multiArray.push([10,11], [20,21])
另一种方法是:
multiArray.push(JSON.parse(JSON.stringify(singleArray)));
在这里,您将对数组进行字符串化,然后再次对其进行解析,从而创建一个新数组。一种“克隆”,如果你愿意的话。
使用slice
是此特定方案的更好选择:
multiArray.push(singleArray.slice(0));
答案 1 :(得分:1)
有很多方法可以做到这一点并获得你想要的东西。 。 。其他两个答案也会这样做,这两种方法也是如此:
multiArray.push(["10", "11"]);
multiArray.push(["20", "21"]);
。 。 。和。 。
multiArray.push(new Array("10", "11"));
multiArray.push(new Array("20", "21"));
两者都会产生一个数组:[["10", "11"], ["20", "21"]]
最后,重要的是你需要为你存储的每组值创建一个新的数组实例,因为外部数组只是存储指向它所包含的每个内部数组的指针。
答案 2 :(得分:0)
这是一个对象引用问题 - 数组是对象,因此当您修改[0]和[1]时,您将在两个位置修改它。 使用切片复制内容:
var multiArray = [],
singleArray = [];
singleArray[0] = "10";
singleArray[1] = "11";
multiArray.push(singleArray.slice(0));
singleArray[0] = "20";
singleArray[1] = "21";
multiArray.push(singleArray);
console.log(multiArray); // [["10", "11"], ["20", "21"]]