2017-12-30 15 views
-1

다차원 배열 (myArray)에서 임의의 항목을 선택하고 새 변수 (myTempArray)에 저장 한 후 첫 번째 항목을 ID 번호로 업데이트하는 함수를 작성하려고합니다. counter).Javascript 슬라이스 사용 이전 값

mytempArray [0] [0] [0]의 값을 변경하면 myArray의 해당 값도 업데이트됩니다. 나는이 가치들이 바뀌길 원하지 않는다.

어떻게 이런 일이 일어나지 않습니까? 슬라이스가 잘못된 방법으로 사용합니까? 그렇다면 원래 배열 항목을 복제하여 수정할 수 있고 다른 곳에서 사용할 수 있습니까? 코드는 다음과 같습니다 :

var myArray = [ 
[[0, "Description 1", 0, 0, 1, 6, 0, 0, 0, true, 0]], 
[[0, "Description 2", 0, 0, 1, 6, 0, 0, 0, true, 0]], 
[[0, "Description 3", 0, 0, 1, 6, 0, 0, 0, true, 0]], 
]; 

function randomNumber (min, max) { 
return Math.floor((Math.random() * max) + min); 
}; 

counter = 1; 

function myfunction(){ 

myrand = randomNumber(0,myArray.length-1); 
mytempArray = myArray.slice(myrand,myrand+1); 
mytempArray[0][0][0] = counter; 
counter++; 
}; 

myfunction(); 
+0

배열은 참조 유형입니다. 'slice'는 얕은 복제 만하고 중첩 된 배열은 참조로 새로운 배열로 복사됩니다. –

+1

배열을 전체적으로 복사하는 방법을 살펴보십시오. https://stackoverflow.com/questions/597588/how-do-you-clone-an-array-of-objects-in-javascript – MynockSpit

+0

'Object.assign()'외에도'... []'스프레드 연산자. –

답변

0

slice은 당신의 구조에서 한 수준에서 작동 기억하십시오. 으로 깊게 복사하려면 직접 구현해야합니다.

function myfunction() { 
    var myrand = randomNumber(0, myArray.length - 1); 
    var mytempArray = myArray.slice(myrand, myrand + 1); // <== Only copies one level 
    mytempArray[0] = mytempArray[0].slice();    // <== Copy the next 
    mytempArray[0][0] = mytempArray[0][0].slice();  // <== And the next 
    mytempArray[0][0][0] = counter; 
    // Presumably do something with `mytempArray` or return it 
    counter++; 
} 

내가 거기에서 만든 몇 가지 다른 변경 사항은 아래를 참조하십시오.


측면 노트의 몇 :

  • 당신이 어딘가에 당신이 당신의 코드 * The Horror of Implicit Globals 먹이를 떨어지는 표시하지 않은 myrandmytempArray를 선언하지 않는 한. 변수를 선언해야합니다.
  • 함수의 끝에 ;에 대한 필요가 없습니다 선언 (함수에 표현를 반대). ;은 문장 종결 자입니다. 선언은 진술이 아닙니다.

* (즉 내 빈혈 작은 블로그에 게시물입니다)

+0

데이터가 유효한 JSON이라면, 'var deepCopy = JSON.parse (JSON.stringify (oldArray));'. –

+0

@ JaredSmith : 데이터를 복사하기 위해'stringify' +'parse'를 사용하는 것이 여러 단계에서 잘못된 것이라고 강하게 믿습니다. :-) –

+0

글쎄, 범용 대안은 재귀 적으로 데이터 구조를 복사하는 것입니다. JavaScript에서 trampolining 또는 메모리 부족을 피하기 위해 명시 적 스택을 유지하는 것을 의미합니다. 또는 모든 중복 및 버그 가능성을 포함하여 특정 데이터 구조에 대해 백만 가지 버전의 일회용 버전을 작성할 수 있습니다. 나는 그것이 당신이 그것을 자르는 방식 (말장난 의도)에 상관없이 '옳은 것'이 될 것이라고 생각하지 않습니다. –