1

我正在使用 jquery each 函数循环遍历一个数组。当我使用 splice 修改原始数组时,我为其分配了一个临时变量来循环而不是实际数组本身。temp但是,即使我 splice ,它看起来也正在被修改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 时,在 temp 的第 4 次迭代中,v 变为未定义,因此下一行会输出“无法读取未定义长度”的错误。这发生在array.splice(3,1)被调用之后,似乎 temp 指向与数组相同的位置,而不是它的副本。
任何人都可以帮忙吗?

4

3 回答 3

3

数组和对象是通过引用分配的。temparray引用相同的数组。.slice() 您可以使用[MDN]创建浅拷贝:

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 回答