jQuery每个数组的问题

时间:2011-09-18 11:28:05

标签: javascript jquery arrays each array-splice

我使用jquery每个函数循环遍历一个数组。我为它分配一个临时变量而不是实际的数组本身,因为我正在使用splice修改原始数组。但是,即使我拼接temp,看起来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);

在第三次调用的例子中,在temp的第4次迭代中,v变为未定义,因此下一行抽出“无法读取未定义长度”的错误。这种情况发生在array.splice(3,1)被调用之后,似乎temp指向与数组相同的位置而不是它的副本。
任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:2)

temp只是对同一个数组的引用,所以temp和array是一回事。你想制作一份副本,如下:

temp = array.slice(0);

答案 2 :(得分: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