자바스크립트의 배열에서는 기본적으로 많은 종류의 내장 함수를 제공하고 있고 이를 이용하면 보다 간단한 코드로 다양한 기능을 구현할 수 있다.
forEach
와 map
, filter
함수는 기본적으로 배열을 반복하는데 초점을 둘 필요가 있다.
forEach
는 배열을 반복하여 기존 값을 가져오는데 주로 쓰인다.
const arr = [1, 2, 3, 4, 5];
arr.forEach(item => {
console.log(item); //1 2 3 4 5
});
map
과 forEach
의 차이는 배열을 반복하면서 각각의 원소에 대하여 특정 로직을 수행한 뒤, 새로운 배열을 반환하고 싶을 때 주로 사용한다.
const arr = [1, 2, 3, 4, 5];
const newArr = arr.map(item => {
return item * 2;
});
console.log(arr); //[1, 2, 3, 4, 5]
console.log(newArr); //[2, 4, 6, 8, 10]
위에서 볼 수 있듯이 map
을 통해 반환한 배열은 깊은 복사를 사용하기 때문에 기존 배열을 영향을 주지 않고 새로운 배열을 반환한다.
filter
함수의 기능은 이름 그대로 배열을 반복하며 각각의 원소들 중 특정 조건에 해당하는 원소들만 뽑아내어 새로운 배열을 반환한다.
filter
또한 map
과 마찬가지로 기존 배열에 영향을 주지 않는다.
const arr = [1, 2, 3, 4, 5];
const newArr = arr.filter(item => {
return item >= 3;
})
console.log(arr); //[1, 2, 3, 4, 5]
console.log(newArr); //[3, 4, 5]
indexOf
함수는 배열에서 찾고자 하는 원소가 있다면 그 원소의 index
값을 반환한다.
const arr = ['a', 'b', 'c', 'd'];
console.log(arr.indexOf('c')); //2
findIndex
함수도 indexOf
함수와 마찬가지로 찾고자 하는 원소의 index
값을 반환한다. 하지만 원소가 객체로 되어있거나 배열로 되어있을 때 indexOf
함수로는 index
값을 찾을 수 없다. 반면, findIndex
함수는 조건 처리를 통하여 index
값을 찾을 수 있다.
const arr = [
{
id: 1,
name: 'BKJang',
age: 27,
},
{
id: 2,
name: 'JHKim',
age: 25,
}
]
console.log(arr.findIndex(item => item.id === 2)); //1
find
함수는 findIndex
함수와 사용법은 동일하지만 반환하는 값이 index
값이 아닌 찾아낸 값 자체를 반환한다.
const arr = [
{
id: 1,
name: 'BKJang',
age: 27,
},
{
id: 2,
name: 'JHKim',
age: 25,
}
]
console.log(arr.find(item => item.id === 2));
// {id: 2, name: "JHKim", age: 25}
splice
와 slice
함수는 배열에서 특정 원소들을 제거할 때 사용하는 함수다.
splice
함수의 첫번째 파라미터는 지우기 시작할 원소의 index
, 두번째 파라미터는 지울 원소의 갯수를 넘긴다.
const arr = ['a', 'b', 'c', 'd', 'e'];
const arr2 = arr.splice(2, 3);
console.log(arr); //["a", "b"]
console.log(arr2); //["c", "d", "e"]
slice
함수와 splice
함수의 가장 큰 차이점은 slice
함수는 기존 배열에 영향을 주지 않고 새로운 배열을 반환한다는 것이다.
또 다른 차이점은 slice
함수는 두번째 파라미터로 보낸 원소의 index
값 전까지 원소를 제거한다.
const arr = ['a', 'b', 'c', 'd', 'e'];
const arr2 = arr.slice(1, 3);
console.log(arr); //["a", "b", "c", "d", "e"]
console.log(arr2); //["b", "c"]
shift
, unshift
, push
, pop
함수는 기존 배열에 앞, 뒤로 새로운 원소를 추가하거나 기존 배열의 원소를 하나씩 제거하는 함수다.
이 함수들은 모두 기존 배열에 영향을 미치는 함수들이다. 보통 Queue
나 Stack
을 구현할 때 많이 사용하는 함수들이다.
shift
함수는 기존 배열의 원소를 앞에서부터 하나씩 제거한다.
const arr = [1, 2, 3, 4, 5];
arr.shift();
console.log(arr); //[2, 3, 4, 5]
arr.shift();
console.log(arr); //[3, 4, 5]
unshift
함수는 기존 배열에 새로운 원소를 앞에 추가한다.
const arr = [1, 2, 3, 4, 5];
arr.unshift(0);
console.log(arr); //[0, 1, 2, 3, 4, 5]
arr.unshift(-1);
console.log(arr); //[-1, 0, 1, 2, 3, 4, 5]
push
함수는 기존 배열에 새로운 원소를 뒤에 추가한다.
const arr = [1, 2, 3, 4, 5];
arr.push(6);
console.log(arr); //[1, 2, 3, 4, 5, 6]
arr.push(7);
console.log(arr); //[1, 2, 3, 4, 5, 6, 7]
pop
함수는 기존 배열의 원소를 뒤에서부터 하나씩 제거한다.
const arr = [1, 2, 3, 4, 5];
arr.pop();
console.log(arr); //[1, 2, 3, 4]
arr.pop();
console.log(arr); //[1, 2, 3]
concat
은 여러 개의 배열을 하나로 합쳐주는 함수다. 기존 배열들에는 영향을 끼치지 않고 새로운 배열을 반환한다. ES6
에서는 concat
대신 Spread Operator
를 많이 사용한다.
//concat
const arr1 = ['a', 'b'];
const arr2 = ['c', 'd', 'e'];
const newArr = arr1.concat(arr2);
console.log(arr1); //["a", "b"]
console.log(arr2); //["c", "d", "e"]
console.log(newArr); //["a", "b", "c", "d", "e"]
//ES6 Spread Operator
const arr1 = ['a', 'b'];
const arr2 = ['c', 'd', 'e'];
const newArr = [...arr1, ...arr2];
console.log(arr1); //["a", "b"]
console.log(arr2); //["c", "d", "e"]
console.log(newArr); //["a", "b", "c", "d", "e"]
join
함수는 배열의 원소들을 합쳐 문자열 형태로 반환한다.
const arr = ['a', 'b', 'c', 'd', 'e'];
console.log(arr.join(', ')); //a, b, c, d, e
console.log(arr.join('')); //abcde
every
와 some
함수는 배열을 반복을 돌리면서 원소들이 특정 조건에 대하여 통과하는지 여부에 대해 검사한다.
every
함수는 특정 조건에 대하여 배열의 모든 원소가 통과해야만 true
를 반환하며 빈 배열에 대해서는 무조건 true
를 반환한다.
const arr = [1, 2, 3, 4, 5];
const result1 = arr.every(item => item <= 5);
const result2 = arr.every(item => item < 3);
console.log(result1, result2); //true false
some
함수는 특정 조건에 대하여 배열의 어떤 한 요소라도 통과하면 true
를 반환하며 빈 배열에 대해서는 무조건 false
를 반환한다.
const arr = [1, 2, 3, 4, 5];
const result1 = arr.some(item => item <= 5);
const result2 = arr.some(item => item < 3);
console.log(result1, result2); //true true
sort
함수는 정렬 기능을 제공하는 함수다. 실제로 Grid
의 정렬 기능을 구현할 때 많이 사용된다.
const fruit = ['orange', 'apple', 'banana'];
fruit.sort();
console.log(fruit); //["apple", "banana", "orange"]
const imD = [
{ name : "BKJang", age : 27},
{ name : "JHKim", age : 25},
{ name : "SHJo", age : 28},
{ name : "DHJung", age : 29},
{ name : "JSKang", age : 23}
]
/* 이름순 */
imD.sort((a, b) => { // 오름차순
return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});
/**
0: {name: "BKJang", age: 27}
1: {name: "DHJung", age: 29}
2: {name: "JHKim", age: 25}
3: {name: "JSKang", age: 23}
4: {name: "SHJo", age: 28}
*/
imD.sort((a, b) => { // 내림차순
return a.name > b.name ? -1 : a.name < b.name ? 1 : 0;
});
/**
0: {name: "SHJo", age: 28}
1: {name: "JSKang", age: 23}
2: {name: "JHKim", age: 25}
3: {name: "DHJung", age: 29}
4: {name: "BKJang", age: 27}
*/
/* 나이순 */
const sortingField = 'age';
imD.sort((a, b) => { // 오름차순
return a[sortingField] - b[sortingField];
});
/**
0: {name: "JSKang", age: 23}
1: {name: "JHKim", age: 25}
2: {name: "BKJang", age: 27}
3: {name: "SHJo", age: 28}
4: {name: "DHJung", age: 29}
*/
imD.sort((a, b) => { // 내림차순
return b[sortingField] - a[sortingField];
});
/**
0: {name: "DHJung", age: 29}
1: {name: "SHJo", age: 28}
2: {name: "BKJang", age: 27}
3: {name: "JHKim", age: 25}
4: {name: "JSKang", age: 23}
*/
reduce
함수는 누적 값과 현재 값을 이용하여 여러 가지 기능을 구현할 수 있는 매우 유용한 함수다. 사실, reduce
만 잘 사용할 줄 알아도 filter
함수의 기능까지도 구현할 수 있다.
reduce
에 대해서는 간단히 설명하는 것 보다는 상세히 설명된 글로 대체한다.