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 답변
-
-
윗분이 너무 좋은 해결방법을 설명해주셨지만 왜 그런지에 관한 설명이 빠져 있어서 설명을 드리자면 "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()"를 통해 새로운 배열을 만들어서 질문자 분께서 원하는 결과를 얻는 것 입니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력