我使用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指向与数组相同的位置而不是它的副本。
任何人都可以帮忙吗?
答案 0 :(得分:3)
通过引用分配数组和对象。 temp
和array
引用相同的数组。您可以使用.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"
这是因为obj1
和obj2
指向内存中的同一个对象。
如果要复制数组,可以使用slice
方法...
var arrayCopy = myArray.slice(0)
现在arrayCopy
& myArray
可以单独编辑。但是,要注意尽管数组本身是独立的,但它们指向相同的对象......
arrayCopy[0] === myArray[0]; // true
arrayCopy[0] = {my: "new object"};
arrayCopy[0] === myArray[0]; // now false