치춘짱베리굿나이스

2차원 배열에서 값 단 하나만 바꾸고 싶은데 모든 줄이 다 바뀌는 경우 본문

Javascript + Typescript/이론과 문법

2차원 배열에서 값 단 하나만 바꾸고 싶은데 모든 줄이 다 바뀌는 경우

치춘 2023. 8. 8. 00:35

뜨악

const arr = new Array(5).fill(new Array(3).fill(0));

arr[1][1] = 1;
console.log(arr.join("\n"));

위와 같은 코드를 이용하여 2차원 배열을 만들고 한 칸의 값을 변경해 보았다

 

모든 줄의 값이 다 변경되는 것을 볼 수 있다

이 이유는 fill() 메서드가 참조만 복사해서 배열을 채우므로, 깊은 복사가 되지 않는 탓이다

new Array()fill 에서 단 한 번만 호출되고, 그 참조로 5개 원소가 채워지는 것이다

C언어로 치자면, 2차원 배열의 각 행이 같은 주소값을 가리킨다고 이해하면 된다

fill 메서드는 원시값으로 배열을 채울 때만 이용하도록 하자

해결법

const arr = Array.from({length: 5}, _ => new Array(3).fill(0));

arr[1][1] = 1;
console.log(arr.join("\n"));

이제 원하는 대로 하나의 원소만 값이 변경된다

Array.from() 은 맵핑 함수 (내부의 콜백 함수) 가 매번 새로운 배열을 생성하기 때문에 참조가 다른 배열들로 구성이 되기 때문


참고 자료

https://stackoverflow.com/questions/68966366/changing-one-value-in-2d-array-changes-whole-line

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/fill

'Javascript + Typescript > 이론과 문법' 카테고리의 다른 글

var, let, const 차이점  (0) 2023.08.17
문자열의 특정 문자 변경하기  (0) 2023.08.08
this in JavaScript  (0) 2023.07.26
클로저  (2) 2023.07.18
UnhandledPromiseRejection  (0) 2023.07.17
Comments