[JS] 실무에서 꼭 필요한 Array 메서드
안녕하세요! aloveu입니다.
오늘은 이것만 알아도 데이터 바인딩 50%는 먹고 간다고 말할 수 있는 Array 메서드들에 대해서 공부해 볼 겁니다.
게시판, 상품, 방명록이나 댓글 같은 리스트 형식의 API를 받다 보면 내가 원하는 형태로 가공하고 화면에 뿌릴 줄 알아야 합니다.
그때 쓸 수 있는 그래도 실무에서 자주 쓸만한 메서드들만 정리해 봤습니다.
| 목차
| map()
맵 메서드는 배열의 모든 요소에 대해 어떤 값을 적용시켜 새로운 배열을 만들 때 씁니다.
arr.map(function(currentValue, index, arr), thisValue)
- currentValue : 현재 처리 중인 요소의 값
- index : 현재 처리중인 요소의 인덱스
- arr : 호출된 map() 매머드의 배열
- thisValue : function 내에서 this로 사용될 값 (선택적)
예를 들어 상품 목록을 받아서 상품 제목만 있는 데이터를 뽑고 싶을 때
const products = [
{name: '반바지', price: 20000, ...},
{name: '반팔', price: 10000, ...},
{name: '긴팔', price: 20000, ...},
{name: '청바지', price: 30000, ...}
];
const productName = products.map((product) => product.name);
console.log(productName); // ['반바지', '반팔', '긴팔', '청바지']
이런식로 새로운 배열을 만들어 낼 수 있습니다.
| filter()
필터는 말 그대로 원하는 조건에 맞는 데이터를 뽑고 싶을 때 사용합니다.
arr.filter(function(currentValue, index, arr), thisValue)
각 인자들에 대한 설명은 이후부터 따로 하지 않겠습니다. 위에 map에서 설명한 것과 거의 동일하거든요.
이전에 깊은 복사, 얕은 복사를 배웠죠?! filter는 기존 배열의 얕은 복사본을 생성합니다.
같은 메모리를 참조하므로 필터가 된 데이터를 수정하면 원본 데이터도 수정이 돼요.
위의 map 예제에서 쉽게 설명을 해 보자면 내 상품중에 고객이 3만 원보다 비싼 상품을 검색했다고 합시다.
const products = [
{name: '반바지', price: 20000, ...},
{name: '반팔', price: 10000, ...},
{name: '긴팔', price: 20000, ...},
{name: '청바지', price: 30000, ...}
];
const expensiveProduct = products.filter((product) => product.price >= 30000);
console.log(expensiveProduct); // [{name: '청바지', price: 30000, ...}]
그럴 때는 기존 데이터에서 filter 메서드를 사용해서 3만 원 이상의 상품만 필터링해서 보여줄 수 있어요.
| find()
find는 내가 제공한 함수의 조건을 만족한 첫 번째 요소를 반환해줍니다.
arr.find(function(currentValue, index, arr), thisValue)
예를 들어 가격이 20000원인 상품 하나를 찾고 싶을 때 쓰면 됩니다.
const product = products.find((product) => product.price === 20000);
console.log(product); // {name: '반바지', price: 20000, ...}
| every()
every 메서드는 배열의 모든 요소가 내가 제시한 조건에 맞는지 체크할 때 씁니다.
모두 통과면 true, 하나라도 조건에 맞지 않으면 false를 반환합니다.
모두 맞아???라는 걸로 생각하시면 됩니다.
arr.every(function(currentValue, index, arr), thisValue)
이번엔 좀 다른 조건으로 예시를 들어봅시다. 예를 들어 아이언맨 상영하는데 좌석에 사람들이 모두 앉아 있다면 매진으로 표시를 하고 싶습니다.
const ironMan = [
{name: '1A', seated: true, ...},
{name: '2A', seated: true, ...},
{name: '3A', seated: true, ...},
...
{name: '16G', seated: true, ...}
];
const isSoldout = ironMan.every((seat) => seat.seated);
console.log(isSoldout); // true
seated가 모두 true인지만 체크하면 매진인지 알 수 있습니다.
| some()
some 메서드는 every와 반대되는 개념입니다. 배열의 요소 중에 하나라도 조건에 맞으면 true, 맞는 게 하나도 없다면 false를 반환합니다.
하나라도 맞아???로 생각하시면 됩니다.
arr.some(function(currentValue, index, arr), thisValue)
어떨 때 많이 쓸까요? 아까 영화 좌석을 예시로 했던 걸 또 예를 들면 자리가 비어있는지 체크를 할 때 쓰면 됩니다.
그러면 every를 쓰고 !isSoldout 으로 쓰면 똑같지 않느냐?? 하시는데 네 맞습니다.
하지만 코드를 짜다 보면 한눈에 읽히는 코드가 좋은 코드니 상황에 맞는 메서드를 사용하시는 게 좋습니다.
const isPossibleTicketing = ironMan.some((seat) => !seat.seated);
console.log(isPossibleTicketing); // false
| reduce()
리듀스는 배열 요소를 하나씩 처리하면서 누적된 결과를 반환합니다.
그래서 보통 총가격의 합을 구할 때 많이 사용하죠.
arr.reduce(function(accumulator, currentValue, currentIndex, array), initialValue)
- accumulator : 콜백 함수의 이전 반환값
- currentValue : 현재 요소의 값
- currentIndex : 현재 요소의 인덱스 (선택적)
- array : reduce 메서드가 호출된 배열 (선택적)
- initialValue : accumulator의 초기값 (선택적)
예를 들면 장바구니에서 결제를 하려고 체크를 한 상품의 총액을 구하고 싶을 때 사용합니다.
const cart = [
{ product: '반바지', price: 23000, isChecked: true, ...},
{ product: '청바지', price: 30000, isChecked: false, ...},
{ product: '반팔티', price: 10000, isChecked: true, ...},
];
const totalPrice = cart.reduce((acc, curr)=>{
return curr.isChecked ? acc + curr.price : acc;
}, 0);
console.log(totalPrice); // 33000
| sort()
소트는 말 그대로 정렬입니다. 정렬 순서는 기본적으로 문자열 유니코드 순서를 따르지만 사용자 정의 비교함수를 전달할 수 있습니다.
arr.sort(compareFunction)
보통 사용자 정의 함수는
- 양수반환을 하면 내림차순이 됩니다. 그래서 보통 내림차순은 b - a를 리턴합니다.
- 음수반환을 하면 오름차순이 됩니다. a - b는 오름차순이 됩니다.
소트는 내용이 너무 많아 따로 포스팅하기로 하고 여기서는 기본적인 것만 예시로 들겠습니다.
// 숫자 배열 정렬하기
const numbers = [5, 2, 9, 1, 7];
numbers.sort(function(a, b) {
return a - b; // 오름차순 정렬
});
console.log(numbers); // [1, 2, 5, 7, 9]
// 문자열 배열 정렬하기
const names = ['Alice', 'Bob', 'Charlie', 'David'];
names.sort();
console.log(names); // ['Alice', 'Bob', 'Charlie', 'David']
// 객체 배열 정렬하기
const people = [
{ name: 'Alice', age: 30 },
{ name: 'Bob', age: 25 },
{ name: 'Charlie', age: 35 }
];
people.sort(function(a, b) {
return a.age - b.age; // 나이 순으로 오름차순 정렬
});
console.log(people);
// [{ name: 'Bob', age: 25 }, { name: 'Alice', age: 30 }, { name: 'Charlie', age: 35 }]
| 참고
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
'IT > 개발' 카테고리의 다른 글
[Vite] vite로 번들링 도구를 바꾸기 (81) | 2024.04.14 |
---|---|
[Angular] standalone 적용하기 (58) | 2024.04.13 |
[JS] 깊은 복사와 얕은 복사 (72) | 2024.04.10 |
[Vue] Router 이동할 때 페이지 스와이프 효과 주기 (68) | 2024.04.06 |
[CSS] 버튼에 animation 적용하기 (59) | 2024.04.05 |