Learning JavaScript - 배열 3편
이 포스팅은 Learning JavaScript의 8장(배열과 배열 처리)을 참고하여 작성 되었다.
삭제되거나 정의되지 않은 요소들
Array 메서드는 삭제되거나 정의되지 않은 요소들을 다룰 때 좀 당혹스럽게 동작하곤 한다. map
과 filter
, reduce
는 삭제되거나 정의되지 않은 요소들에서 콜백 함수를 호출하지 않는다.
예를 들어 ES5에서 배열을 초기화할 때 다음과 같은 방법을 시도해 보고 실망했던 사람도 있을 것이다.
const arr = Array(10).map(function(x) { return 5 });
arr
의 요소는 전부 undefined
이다. 이와 비슷하게, 배열 중간의 요소를 삭제하고 map
을 호출하면 배열 가운데 구멍이 생긴다.
const arr = [1, 2, 3, 4, 5];
delete arr[2];
arr.map(x => 0); // [0, 0, undefined, 0, 0]
일반적으로 배열을 다룰 때는 모든 요소가 명시적으로 정의된 배열을 다루고, 의도적으로 배열안에 빈 부분을 만든다 하더라도 배열에 delete
를 쓰지는 않을 테니 현실적으로는 이런 동작이 문제를 일으킬 가능성은 거의 없다.
하지만 알아둬서 나쁠 것은 없다.
문자열 병합
배열의 문자열 요소들을 몇몇 구분자로 합치려 할 때가 많다. Array.prototype.join
은 개변수로 구분자 하나를 받고 요소들을 하나로 합친 문자열을 반환한다.
이 매개변수가 생략됐을 때의 기본값은 쉼표이며, 문자열 요소를 합칠 때 정의되지 않은 요소, 삭제된 요소, null
, undefined
는 모두 빈 문자열로 취급한다.
const arr = [1, null, 'hello', 'world', true, undefined];
delete arr[3];
arr.join();
// '1,,hello,,true'
arr.join('');
// '1hellotrue'
arr.join(' -- ');
// '1 -- -- hello -- -- true --'
문자열 병합과 Array.prototype.join
을 함께 쓰면 HTML <ul>
리스트 같은 것도 만들 수 있다. 이때 빈 배열에 사용하면 빈 <li>
요소 하나만 나올 것이다.
const attributes = ['Nimble', 'Perceptive', 'Generous'];
const html = '<ul><li>' + attributes.join('</li><li>') + '</li></ul>';
// html: "<ul><li>Nimble</li><li>Perceptive</li><li>Generous</li></ul>"
요약
자바스크립트 Array
클래스에는 강력하고 유연한 메서드가 많지만, 때로는 어떤 메서드가 최선일지 판단하기 어려울 때도 있다. 다음 표들은 Array
메서드를 요약한 것이다.
콜백 함수를 받는 find, findIndex, some, every, map, filter, reduce
에서 콜백 함수가 제공받는 매개변수는 아래와 같다.
배열 함수의 매개변수(순서대로)
메서드 | 설명 |
---|---|
reduce에만 적용 | 누적값. 초깃값 또는 마지막 호출에서 반환한 값 |
모든 메서드 | 요소(현재 요소의 값) |
모든 메서드 | 현재 요소의 인덱스 |
모든 메서드 | 배열 자체 |
콜백을 받는 메서드들은 또한 옵션으로 콜백을 호출할 때 this
로 사용할 값을 받을 수 있다. 이 매개변수를 활용하면 콜백 함수를 메서드처럼 사용할 수 있다.
배열 콘텐츠 조작
하고 싶은 일 | 사용할 메서드 | 수정 또는 사본 |
---|---|---|
스택(후입 선출)을 만들 때 | push(바뀐 길이 반환) , pop |
배열 수정 |
큐(선입 선출)를 만들 때 | unshift(바뀐 길이 반환) , shift |
배열 수정 |
여러 요소를 배열 마지막에 추가할 때 | concat |
사본 반환 |
배열 일부가 필요할 때 | slice |
사본 반환 |
임의의 위치에 요소를 추가하거나 제거할 때 | splice |
배열 수정 |
배열 안에서 요소를 교체할 때 | copyWithIn |
배열 수정 |
배열을 채울 때 | fill |
배열 수정 |
배열을 반대로 정렬할 때 | reverse |
배열 수정 |
배열을 정렬할 때 | sort(정렬 함수 사용 가능) |
배열 수정 |
배열 검색
찾고자 하는 것 | 사용할 메서드 |
---|---|
요소의 인덱스 | indexOf(단순한 값) , findIndex(복잡한 값) |
인덱스를 뒤에서부터 찾을 때 | lastIndexOf(단순한 값) |
요소 자체 | find |
조건을 만족하는 요소가 들어있는지 확인할 때 | some |
모든 요소가 그 조건을 만족하는지 확인할 때 | every |
배열 변형
하고 싶은 일 | 사용할 메서드 | 수정 또는 사본 |
---|---|---|
배열의 모든 요소를 변형할 때 | map |
사본 반환 |
조건에 맞는 요소만 남길 때 | filter |
사본 반환 |
배열 전체를 다른 데이터 타입으로 변형할 때 | reduce |
사본 반환 |
요소를 문자열로 바꿔서 하나로 합칠 때 | join |
사본 반환 |