更改子阵列何时更新子阵列而不是创建新的子阵列? [JavaScript的]

时间:2016-09-20 19:00:46

标签: javascript arrays pointers multidimensional-array nested

我有一个 [编辑:JavaScript] 代码,该代码使用从我的主数据集dataSelectedArray跟踪的子数组mainArray。主数据存储为数组数组。

mainArray = [ [1,2,3],[3,4,2],[5,1,0] ];
dataSelectedArray=[];
for (var i=0; i<dataArray.length; i++) {
    if ( someLogic ) {
        dataSelectedArray.push(mainArray[i]);
    }
}

因此,dataSelectedArray保存指向mainArray存储的值的指针。稍后,我需要通过将mainArray中的数据替换为updatedData来更新dataSelectedArray。我还需要更新var mainArray = [ [1,2,3],[3,4,2],[5,1,0] ]; var dataSelectedArray=[]; for (var i=0; i<mainArray.length; i++) { if ( i<2 ) { dataSelectedArray.push(mainArray[i]); } } updatedData = [ [ 1,0,0],[7,4,2] ]; for (var index= 0; index < updatedData.length; index++) { // this doesn't update dataSelectedArray mainArray[index] = updatedData[index]; } console.log(mainArray[0]); console.log(dataSelectedArray[0]);。我可以想到两种方法:将每个迷你阵列更新为一组,或者更新每个组件。

&#13;
&#13;
var mainArray = [ [1,2,3],[3,4,2],[5,1,0] ];
var dataSelectedArray=[];
for (var i=0; i<mainArray.length; i++) {
	if ( i<2 ) {
		dataSelectedArray.push(mainArray[i]);
	}
}
	
updatedData = [ [ 1,0,0],[7,4,2] ];
for (var index= 0; index < updatedData.length; index++) {
	// this *does* update dataSelectedArray
	mainArray[index][0] = updatedData[index][0];
	mainArray[index][1] = updatedData[index][1];
	mainArray[index][2] = updatedData[index][2];
}
console.log(mainArray[0]);
console.log(dataSelectedArray[0]);
&#13;
&#13;
&#13;

&#13;
&#13;
dataSelectedArray
&#13;
&#13;
&#13;

第一种方法没有更新{{1}} ......为什么不呢?是否有更短的(单线)方式来做第二种方法?

1 个答案:

答案 0 :(得分:0)

当你这样做时:

dataSelectedArray.push(mainArray[i]);

dataSelectedArray包含对子数组的引用。这是mainArray中原始参考来自的位置的引用。因此,重新分配mainArray[i]dataSelectedArray中的值没有影响。

与多个变量引用相同数组的情况没什么不同:

var a = [1, 2, 3];
var b = a; // a and b now refer to the same array
b[1] = 6;
console.log(a[1]); // Outputs 6
b = [7, 8, 9]; // b now refers to a different array
console.log(a[1]); // Still 6 -- a hasn't been modified