Section 7. 자바스크립트 배열의 기본 메서드들
I. 특정 값을 반호나하는 기본 메서드들
1. (정적) isArray - 배열인지 여부를 반환하는 메서드
console.log(
Array.isArray([1, 2, 3]),
Array.isArray('123'),
Array.isArray('123'.split(''))
); //true false true
배열 여부를 boolean 값으로 반환한다.
2. at - 주어진 인자를 인덱스로 값을 반환하는 메서드
at은 음수를 사용하여 뒤에서부터 접근이 가능하다는 사실을 전에 배웠다.
const arr = [
'한놈', '두시기', '석삼', '너구리', '오징어'
];
console.log(
arr.at(1), arr.at(2)
); //두시기 석삼
console.log(
arr.at(-1), arr.at(-2)
); //오징어 너구리
3. includes - 인자로 주어진 요소 유무를 확인하는 메서드
const arr = [1, 2, 3, 'abc', true];
console.log(
arr.includes(2),
arr.includes('abc'),
arr.includes(true),
); //true true true
인자에 해당 요소가 있으면 true 아니면 false를 반환한다.
참조형 데이터의 경우는 다음과 같다
const obj1 = { x: 1, y: 2 };
const obj2 = { x: 1, y: 2 };
const arr = [
obj1,
{ x: 3, y: 4 }
];
console.log(
arr.includes(obj1),
arr.includes(obj2),
arr.includes({ x: 1, y: 2 }),
arr.includes({ x: 3, y: 4 })
); //true false false false
두 번째 출력문은 obj1과 값이 같은데도 첫 번째 출력문에서는 true를 반환했고 이번에는 false를 반환했다. 그 이유는 참조형 데이터이기 때문에 비록 같은 값을 가지고 있어도 그 값이 다른 주소를 참조하고 있는 값이여서 obj1 = obj2가 될 수 없는 것이다.
4. indexOf, lastIndexOf - 앞에서 첫 번째 값의 인덱스를 반환하는 그리고 마지막으로 그 값의 인덱스를 반환하는 메서드
const arr = [1, 2, 3, 2, 1];
console.log(
arr.indexOf(2),
arr.lastIndexOf(2),
arr.indexOf(4)
); //1 3 -1
5. join - 인자로 주어진 값으로 구분하여 요소들을 문자열로 연결하여 반환하는 메서드
*원본값이 바뀌는 것은 아니다.
const arr1 = ['a', 'b', 'c', 'd', 'e'];
const arr2 = [
1, true, null, undefined, '가나다', { x: 0 }, [1, 2, 3]
];
console.log(
arr1.join()
); //a,b,c,d,e
인자가 없으면 , 로 구분하여 반환한다.
console.log(
arr1.join('')
); //abcde
console.log(
arr1.join(' ')
); //a b c d e
console.log(
arr2.join(':')
); //1:true:::가나다:[object Object]:1,2,3
마지막 출력문을 보면 null이나 undefined는 공백으로 무시가 된 것을 볼 수 있다.
II. 배열을 변경하는 기본 메서드들
1. push, unshift - 배열에 값을 추가하는 메서드
결과의 길이를 반환한다.
push - 값을 뒤에 추가한다
const arr = [1, 2, 3];
const x = arr.push(4);
console.log(x, arr); //4 (4) [1, 2, 3, 4]
const y = arr.push(5, 6, 7); // 최종 길이 반환
console.log(y, arr); //7 (7) [1, 2, 3, 4, 5, 6, 7]
unshift - 값을 앞에 추가한다
const arr = [5, 6, 7];
const x = arr.unshift(4);
console.log(x, arr); //4 (4) [4, 5, 6, 7]
const y = arr.unshift(1, 2, 3);
console.log(y, arr); //7 (7) [1, 2, 3, 4, 5, 6, 7]
두 메서드들의 특징을 비교해보면 다음과 같다
- 수정된 배열의 길이를 반환한다.
- 부수효과가 일어난다 - 원본 배열을 변경한다.
- push 보다 unshift가 더 느리다. 이유는 이후 요소들을 밀어내야 하기때문이다.
2. pop, shift - 배열에서 값을 제거하여 반환하는 메서드
pop - 값을 뒤에서 제거하여 반환한다.
const arr = [1, 2, 3, 4, 5];
const x = arr.pop();
console.log(x, arr); //5 (4) [1, 2, 3, 4]
const y = arr.pop();
console.log(y, arr); //4 (3) [1, 2, 3]
shift - 값을 앞에서 제거하여 반환한다.
const arr = [1, 2, 3, 4, 5];
const x = arr.shift();
console.log(x, arr); //1 (4) [2, 3, 4, 5]
const y = arr.shift();
console.log(y, arr); //2 (3) [3, 4, 5]
역시 pop보다 shift가 더 느리다. 이유는 이후 요소들을 당겨야 해서 그렇다.
3. splice - 원하는 위치에 요소(들)을 추가 및 삭제하는 메서드
2개 이상의 인자를 받는다.
- start : 배열 변경을 시작할 위치
- deleteCount : 제거할 요소의 개수
- item(s) : 추가할 하나 이상의 요소
const arr = [1, 2, 3, 4, 5, 6, 7];
// 2번 인덱스부터 2개 요소 제거
arr.splice(2, 2);
console.log(arr); //(5) [1, 2, 5, 6, 7]
// 3번 인덱스부터 요소 제거 없이 'a' 추가
arr.splice(3, 0, 'a');
console.log(arr); //(6) [1, 2, 5, 'a', 6, 7]
// 1번 인덱스부터 3개 요소 제거 후 '가', '나', '다' 추가
arr.splice(1, 3, '가', '나', '다');
console.log(arr); //(6) [1, '가', '나', '다', 6, 7]
배열의 delete는 empty 값을 남긴다.
const arr = [1, 2, 3, 4, 5];
delete arr[2];
console.log(arr); //(5) [1, 2, 비어 있음, 4, 5]
때문에 배열의 값 삭제에는 splice를 사용한다.
arr.splice(2, 1);
console.log(arr); //(4) [1, 2, 4, 5]
4. fill - 배열을 특정 값으로 채우는 메서드
// 중간의 빈 값도 채움
const arr1 = [1, 2, , , 4, 5];
arr1.fill(7);
console.log('1.', arr1); //1. (6) [7, 7, 7, 7, 7, 7]
빈 값도 7로 채워지는 것을 볼 수 있다.
// 💡 특정 값으로 채운 배열 생성시 유용
const arr2 = new Array(10);
arr2.fill(1);
console.log('2.', arr2); //2. (10) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
arr2.fill(2, 3);
console.log('3.', arr2); //3. (10) [1, 1, 1, 2, 2, 2, 2, 2, 2, 2]
인자가 둘일 때 : (채울 값, ~부터) 식으로 작동한다.
arr2.fill(3, 6, 9);
console.log('4.', arr2); //4. (10) [1, 1, 1, 2, 2, 2, 3, 3, 3, 2]
인자가 셋일 때 : (채울 값, ~ 부터, ~전까지)
5. reverse - 배열의 순서를 뒤집는 매서드
const arr = [1, 2, 3, 4, 5, 6, 7];
console.log(arr); //(7) [1, 2, 3, 4, 5, 6, 7]
reverse 메서드 자체도 뒤집힌 배열을 반환한다.
arrRev = arr.reverse();
// 원본 배열 뒤집힘
console.log(arr, arrRev); //(7) [7, 6, 5, 4, 3, 2, 1] (7) [7, 6, 5, 4, 3, 2, 1]
III. 새 배열을 반환하는 기본 메서드
특성은 다음과 같다
- 원본 배열을 수정하지 않는다.
- 얕은 복사본이다.
1. concat - 배열에 다른 배열이나 값을 이어붙인 결과를 반환하는 메서드
const arr1 = [1, 2, 3];
const arr2 = ['a', 'b', 'c'];
const arr3 = [true, false];
const arr4 = arr1.concat(arr2);
console.log(arr4); //(6) [1, 2, 3, 'a', 'b', 'c']
const arr6 = arr1.concat('ABC', arr2, arr3, 100);
console.log(arr6); //(10) [1, 2, 3, 'ABC', 'a', 'b', 'c', true, false, 100]
console.log(arr1, arr2, arr3); //(3) [1, 2, 3] (3) ['a', 'b', 'c'] (2) [true, false]
해당 배열 뒤로 인자로 하나 이상 주어진 다른 배열이나 값을 이어붙인 결과를 반환하는 것을 볼 수 있다.
2. slice - 인자로 주어진 범주의 값을 잘라 반환하는 메서드
특성은 다음과 같다
- 1~2개 인자를 받는다.
- begin : 시작 위치
- end : 종료 위치
- 원본에는 영향을 주지 않는다.
const arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const arr2 = arr1.slice(3);
const arr3 = arr1.slice(3, 7);
console.log(arr2, arr3); //(6) [4, 5, 6, 7, 8, 9] (4) [4, 5, 6, 7]
3. flat - 인자로 주어진 깊이 만큼 배열을 펼쳐 반환하는 메서드
[
1,
[2, 3],
[4, 5, 6],
7
]
↓ ↓ ↓
[
1,
2,
3,
4,
5,
6,
7
]
이런 식으로 평평하게 한다는 의미이다. 역시 원본에는 영향을 주지 않는다.
const orgArr = [
1, 2,
[3, 4],
[5, [6, [7, 8]]]
];
// 인자가 없으면 1을 넣은 것과 같음
const arr0 = orgArr.flat();
const arr1 = orgArr.flat(1);
const arr2 = orgArr.flat(2);
const arr3 = orgArr.flat(3);
console.log('N:', arr0); //N: (6) [1, 2, 3, 4, 5, Array(2)]
console.log('1:', arr1); //1: (6) [1, 2, 3, 4, 5, Array(2)]
console.log('2:', arr2); //2: (7) [1, 2, 3, 4, 5, 6, Array(2)]
console.log('3:', arr3); //3: (8) [1, 2, 3, 4, 5, 6, 7, 8]