for loop 를 이용해 비어있는 이중 배열의 인덱스에 변수를 지정할 때 오류가 발생합니다 - JavaScript

조회수 429회
testOne = [['ex','ex','ex'],['ex','ex','ex'],['ex','ex','ex'],['ex','ex','ex'],['ex','ex','ex'],];
xx = [];
realCal = ['a','b','c'];
    for (let i = 0; i < testOne.length; i++) 
          {
          xx[i] = realCal;
          xx[i][0] = i;
       }
console.log(xx);

제가 원하는 결과:

(5) [Array(3), Array(3), Array(3), Array(3), Array(3)]
0:  [0, "b", c]
1:  [1, "b", c]
2:  [2, "b", c]
3:  [3, "b", c]
4:  [4, "b", c]

실제 결과:

(5) [Array(3), Array(3), Array(3), Array(3), Array(3)]
0:  [4, "b", "c"]
1:  [4, "b", "c"]
2:  [4, "b", "c"]
3:  [4, "b", "c"]
4:  [4, "b", "c"]

일주일 동안 해결 방법을 고민했지만 도무지 못하겠습니다. 알려주시면 감사하겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • xx[i] = realCal.slice();
    

    슬라이스를 이용해서 배열을 복제생성 후 assign.

  • 윗분이 너무 좋은 해결방법을 설명해주셨지만 왜 그런지에 관한 설명이 빠져 있어서 설명을 드리자면 "call by value"가 아니라 "call by reference"이기 때문입니다.

    for (let i = 0; i < testOne.length; i++) {
          xx[i] = realCal;
          xx[i][0] = i;
     }
    

    xx[i] = realCal;

    이 부분이 문제에 코드 인데 이때 "xx[i]"에 값을 "복사"해서 집어넣는게 아니라 realCal에 대한 주소 값만 넘겨주게 됩니다. 이 상태에서 "xx[i][0] = i"를 실행하게 되면 "realCal[i][0] = i"와 같은 실행을 하게 됩니다. 따라서 위에 분 처럼 "realCal.splice()"를 통해 새로운 배열을 만들어서 질문자 분께서 원하는 결과를 얻는 것 입니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)