向多维javascript数组添加新条目

时间:2014-02-27 20:49:01

标签: javascript arrays multidimensional-array

我在本网站上看到的所有例子都表明我应该能够做到这一点:

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中的两个条目。

我是否犯了一个非常基本的错误,或者是否有一些解决方法?

感谢您的帮助。

3 个答案:

答案 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"]]