본문으로 건너뛰기
김신건의 로그

[Javascript] Array

· 수정 · 📖 약 1분 · 373자/단어 #javascript #array #fundamentals
JS Array, JavaScript 배열, Array methods

정의

JavaScript 의 Array 는 순서 있는 객체. 정수 키 + length. 풍부한 메서드 (map/filter/reduce/…) 가 함수형 스타일을 지원.

const arr = [1, 2, 3];
typeof arr           // 'object'
Array.isArray(arr)   // true ✓ (typeof 로는 구분 안 됨)

생성

const a = [1, 2, 3];
const b = new Array(3);          // length 3, sparse
const c = new Array(1, 2, 3);    // [1, 2, 3]
const d = Array.of(3);           // [3] (단일 인자도 안전)
const e = Array.from('abc');     // ['a', 'b', 'c']
const f = Array.from({ length: 3 }, (_, i) => i * 2);  // [0, 2, 4]
const g = [...iterable];         // spread

핵심 메서드 (반복)

메서드반환mutates
forEach(fn)undefined
map(fn)새 배열 (같은 길이)
filter(fn)새 배열
reduce(fn, init)accumulator
reduceRight(fn, init)같음 (역방향)
find(fn)첫 매칭 원소
findIndex(fn)첫 매칭 인덱스
findLast(fn)마지막 매칭
some(fn)하나라도 true 면 true
every(fn)모두 true
flat(depth)평탄화
flatMap(fn)map + flat(1)
[1,2,3].map(x => x * 2)              // [2, 4, 6]
[1,2,3,4].filter(x => x % 2 === 0)   // [2, 4]
[1,2,3].reduce((a, b) => a + b, 0)   // 6
[1,2,3].find(x => x > 1)              // 2
[1,2,3].some(x => x > 2)              // true
[1,2,3].every(x => x > 0)             // true
[[1, 2], [3, 4]].flat()               // [1, 2, 3, 4]
[1, 2, 3].flatMap(x => [x, x * 2])    // [1, 2, 2, 4, 3, 6]

변경 (mutates)

메서드효과
push(...)끝에 추가, 새 length
pop()끝에서 제거, 반환
shift()앞에서 제거
unshift(...)앞에 추가
splice(start, deleteCount, ...items)임의 위치 add/remove
sort(cmp)정렬 (in-place!)
reverse()뒤집기 (in-place!)
fill(value, start, end)값으로 채움
copyWithin(target, start, end)내부 복사
const a = [1, 2, 3];
a.push(4)                    // a = [1, 2, 3, 4]
a.pop()                      // 4, a = [1, 2, 3]
a.splice(1, 1)               // [2] 제거, a = [1, 3]
a.splice(1, 0, 'x')          // 1 위치에 'x' 삽입
a.sort((x, y) => x - y)      // 숫자 정렬

검색

메서드의미
indexOf(v)첫 위치 (없으면 -1)
lastIndexOf(v)마지막 위치
includes(v)포함 여부
at(i)i 번째 (음수 OK)
[1, 2, 3].indexOf(2)     // 1
[1, 2, 3].includes(2)    // true
[1, 2, 3].at(-1)          // 3 (마지막)

슬라이스 / 결합

arr.slice(start, end)        // 부분 (end 미포함)
arr.slice()                   // 전체 복사
arr.concat([4, 5])            // 결합
[...arr1, ...arr2]            // spread (선호)

정렬 함정

[10, 1, 2].sort()                  // [1, 10, 2]  ⚠️ 문자열 비교
[10, 1, 2].sort((a, b) => a - b)   // [1, 2, 10]  ✓

기본 sort 는 문자열 변환 후 사전순. 숫자는 항상 비교 함수 명시.

stable sort

ES2019+ 모든 엔진이 stable sort 보장.

arr.sort((a, b) => a.priority - b.priority)
// 같은 priority 의 원소는 원래 순서 유지

새 (불변) vs 변경 메서드 (ES2023)

arr.sort()       // 원본 변경
arr.toSorted()   // 새 배열 반환 (ES2023+)

arr.reverse()    // 원본 변경
arr.toReversed() // 새 배열

arr.splice(...)
arr.toSpliced(...)

arr[0] = 99      // ...
arr.with(0, 99)  // 새 배열, [0] = 99

이런 새 메서드들이 불변 패턴을 더 자연스럽게.

reduce 의 강력함

// 합
[1,2,3].reduce((a, b) => a + b, 0)

// 객체로 그룹화
data.reduce((acc, item) => {
    (acc[item.category] ??= []).push(item);
    return acc;
}, {});

// pipeline
[fn1, fn2, fn3].reduce((acc, fn) => fn(acc), initialValue)

// max
arr.reduce((max, cur) => cur > max ? cur : max, -Infinity)

sparse 배열

const a = new Array(3);   // [empty × 3]
a[5] = 99;                 // [empty × 5, 99]
a.length                   // 6
a.forEach(x => console.log(x))  // empty 는 skip

빈 슬롯이 있는 배열. 일반적으로 피하는 것이 좋음.

Array-like → Array

Array.from(arguments)
Array.from(document.querySelectorAll('div'))
Array.from({ length: 5 }, (_, i) => i)   // [0, 1, 2, 3, 4]
[...nodeList]                              // spread

함정

1. typeof 로 배열 검사 불가

typeof []           // 'object'
Array.isArray([])   // ✓

2. length 변경

const a = [1, 2, 3];
a.length = 1;
a            // [1] (잘림)
a.length = 5;
a            // [1, empty × 4]

3. splice 의 인자

arr.splice(1)        // 1 부터 끝까지 제거
arr.splice(1, 0, 'x')  // 1 에 'x' 삽입 (제거 X)
arr.splice(1, 1, 'x')  // 1 에서 1개 제거, 'x' 삽입

참고

이 글의 용어 (4개)
[Javascript] Destructuringjavascript
정의 Destructuring 은 배열 또는 객체의 일부를 변수로 풀어내는 ES6 문법. 코드를 짧고 명시적으로. 객체 배열 함수 매개변수 자주 쓰는 idiom API 응답 분해…
[Javascript] Objectjavascript
정의 JavaScript 의 는 key-value 쌍의 컬렉션. 거의 모든 non-primitive 값이 객체. 함수, 배열, 정규식도 객체. 생성 접근 수정 / 삭제 Objec…
[Javascript] Spread / Restjavascript
정의 같은 문법 가 두 가지 의미. - Spread : iterable 을 펼침 (right-hand) - Rest : 나머지를 모음 (left-hand 또는 함수 매개변수) S…
고차 함수javascript
- 고차함수란 하나 이상의 함수를 인자로 받거나 반환하는 함수를 말합니다. - 일급 함수라는 특성을 활용해 실제로 함수를 다루는 연산을 수행하는 함수입니다. 즉, 아래 조건 중 …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기