1

jquery each 関数を使用して配列をループしています。スプライスを使用して元の配列を変更しているため、実際の配列自体の代わりにループする一時変数を割り当てます。ただし、tempsplice しても変更されているようですarray

function example (Data, index, array) {
            var temp = array;
            $.each(temp, function(i, v) {    
                if(Data["b"+v].length > index) {
                    //do stuff
                } else {
                    array.splice(i,1);
                }
            });
            if(array.length > 0) {
                example(Data, index+1, array);
            }
}
array = [1,2,3,4]
Data = {"b1":[a,b,c,d],"b2":[e,f,g,h], "b3":[i,j], "b4":[k,l,m,n]};
example(Data, 0, array);

example の 3 回目の呼び出しで、temp の 4 回目の繰り返しで v が未定義になるため、次の行で「未定義の長さを読み取れません」というエラーが発生します。これは、が呼び出された直後に発生します。これarray.splice(3,1)は、temp が配列のコピーではなく、配列と同じ場所を指しているように見えます。
誰でも助けることができますか?

4

3 に答える 3

3

配列とオブジェクトは参照によって割り当てられます。同じ配列tempを参照します。[MDN]arrayを使用して浅いコピーを作成できます。.slice()

var temp = array.slice();

コピーを作成する代わりに、逆の順序で配列を反復処理できます。

for(var i = array.length; i--; ) {
    if(Data["b"+array[i]].length > index) {
        //do stuff
    } else {
        array.splice(i,1);
    }
}
于 2011-09-18T11:32:07.787 に答える
2

temp は同じ配列への単なる参照であるため、temp と array は同じものです。次のようにコピーを作成します。

temp = array.slice(0);
于 2011-09-18T11:31:41.033 に答える
2

JavaScript の割り当ては参照によるものであり、オブジェクトをコピーしません。例えば...

var obj1 = {};
var obj2 = obj1;
obj2.hello = "world";
console.log( obj1.hello ); // logs "world"

これは、obj1obj2がメモリ内の同じオブジェクトを指しているためです。

配列のコピーを作成する場合は、sliceメソッドを使用できます...

var arrayCopy = myArray.slice(0)

arrayCopy&myArrayを個別に編集できるようになりました。ただし、配列自体は独立していますが、同じオブジェクトを指していることに注意してください...

arrayCopy[0] === myArray[0]; // true
arrayCopy[0] = {my: "new object"};
arrayCopy[0] === myArray[0]; // now false
于 2011-09-18T11:35:01.103 に答える