2011-09-18 7 views
1

jquery 각 함수를 사용하여 배열을 반복합니다. splice를 사용하여 원래의 배열을 수정하고 있기 때문에 실제 배열 자체 대신 루프를 통해 임시 변수를 할당합니다. 그러나 array을 연결할 때 temp이 수정되는 것 같습니다. 예 제 호에서 jQuery 각 배열 문제

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); 

은 온도 4 일 반복에서, V는 정의되고, 따라서 다음 라인은 "미정의 길이를 읽을 수없는"의 오차를 펌프. 이것은 array.splice(3,1)이 호출 된 직후에 발생합니다. temp는 복사본이 아닌 배열과 동일한 위치를 가리키는 것처럼 보입니다.
아무도 도와 줄 수 있습니까?

답변

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); 
    } 
} 
+0

배열을 역순으로 진행하는 것이 훨씬 더 깨끗해 보입니다. – Michael

2

temp는 동일한 배열에 대한 참조 일 뿐이므로 temp와 array는 같은 것입니다. 다음과 같이 사본을 만들고 싶습니다.

temp = array.slice(0); 
2

할당 참고로, 그것은하지 않습니다 개체를 복사하십시오. 예 ... obj1obj2 메모리에서 같은 객체를 가리키고 있기 때문입니다

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

.

당신이 배열의 복사본을 확인하려면 slice 방법을 사용할 수 있습니다 ...

var arrayCopy = myArray.slice(0) 

은 이제 arrayCopy & myArray 독립적으로 편집 할 수 있습니다. 그러나 배열 자체는 독립적이지만 동일한 객체를 가리킨다는 것을 알아 두십시오.

arrayCopy[0] === myArray[0]; // true 
arrayCopy[0] = {my: "new object"}; 
arrayCopy[0] === myArray[0]; // now false