将值添加到多维数组中的特定位置会将值复制到其他数组中的相同位置

时间:2014-01-24 16:29:05

标签: javascript arrays multidimensional-array add

我不太清楚为什么会发生这种情况,但事情就是这样:

我正在尝试编写最长的常见子序列问题但是我遇到了这个错误,我尝试在矩阵中添加一个新值(NxM multidimension数组)但是该值被添加到了所有数组中同样的立场。

示例:将1添加到matrx [1] [1]

0100000
0100000
0100000
...
0100000

这是代码

var input="XMJYAUZ;MZJAWXU";

var string=input.split(";");

var matrix=[];

for(var i=0;i<string[0].length+1;i++){

        matrix[i]=0;

}

var matrx=[];

for(var j=0;j<string[1].length+1;j++){

     matrx[j]=matrix;

}


matrx=buildMatrix(string[0][0],string[1][0],1,1);


function buildMatrix(A,B,x,y){

if (A != B){

    matrx[x][y]=Math.max(matrx[x-1][y],matrx[x][y-1]);

}
else{

    matrx[x][y]=matrx[x-1][y-1]+1;

}

//check x and y
if(x==string[0].length && y==string[1].length){

}
else if(y==string[1].length){

    buildMatrix(string[0][x],string[1][0],x+1,1);

}
else{
    buildMatrix(string[0][0],string[1][y],x,y+1);
}

return matrx;
}

1 个答案:

答案 0 :(得分:1)

这里有一个问题:

var matrx=[];

for(var j=0;j<string[1].length+1;j++){

     matrx[j]=matrix;

}

您是否正在为每个位置添加完全相同的数组。因此,当您向该数组添加项目时,它会出现在所有位置,因为所有位置都指向完全相同的数组。您需要为每个位置添加不同的数组,如下所示:

for(var j=0;j<string[1].length+1;j++){

     matrx[j] = [];

}

可能有助于记住数组和对象是通过引用分配的--javascript只是指定一个指向数组或对象的指针 - 它不会复制。这意味着当你有这样的事情时:

var a = [];
var b = a;

现在,您ba都指向完全相同的数组。如果你这样做:

a.push(3);
console.log(a.length);    // shows 1
console.log(b.length);    // shows 1

您会看到ab都显示相同的更改,因为它们指向同一个数组。


一些相关的参考文献:

Pointer behavior between objects

Do objects pushed into an array in javascript deep or shallow copy?

is it possible in Javascript to tell an object to stop having reference behavior with another object

Javascript by reference vs. by value