결국 우리는 직접 조건을 작성하여, 배열을 처리하는 경우가 많다. 하지만, 이 조건을 메서드를 이용해서 for문 작성없이 깔끔하게 한 문장으로 처리할 수 있다면, 생산성이 아주 좋을 것이다. 그러기 위해서, 나오게된 ES6 문법들을 알아보자.
정확히는 "iterable"하면 쓸 수 있는 메서드지만, Array는 iterable하기 때문에, 아래의 메서드들이 다 사용이 가능하다.
배열을 조건에 맞게 탐색, 만나는 첫번째 원소값을 반환
어떤 요소가 배열안에 있는지 ,없는지 찾고 싶을 때가 있다. 그럴 때 유용하게 쓸 수 있다.
const arr=[1,2,3,4,5,6,7]
find()
- 주어진 판별 함수 (콜백)를 만족하는 첫번째 요소의 값을 반환합니다. 그런 요소가 없다면 undefinded를 반환합니다.
- 사용방법: arr.find([callback])
예를 들어, "5"를 찾고 있다면 , 아래와 같이 할 수 있다.
const res = arr.find((item) =>item === 5) //expect 5
조건에 만족하는 결과값들을 배열로 반환
Find는 반환 값 1개를 넘겨주고, 만나는 첫번째 요소만을 반환한다. 즉, 있는지 없는지 여부나, 문자열이 있는지 등에는 적합하지만, "짝수","홀수"와 여러개의 요소가 나올 수 밖에 없는 개념들은 적합하지 않다. 그럴때 유용하게 쓸 수 있다.
// 2,4,6,... make even number out of array
const arr=[1,2,3,4,5,6,7]
filter()
- 주어진 함수(callback)의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.
- 사용방법: arr.filter(callback(element,index,)[this.arg] )
짝수를 찾는걸 간단하게 나타내 봅시다.
const target = [1,2,3,4,5,6,7]
const even = [1,2,3,4,5,6].filter((number) => number %2===0 )
배열의 요소를 조건에 맞게, 재조정하기
배열들의 원소를 직접 조작하여 새로운 배열을 만들어내고 싶을 수 있습니다. 그럴 때 , 유용하게 쓸 수 있습니다.
// make two times large value out of Array
const arr=[1,2,3,4,5,6,7]
map()
- 배열 내의 모든 요소 각각에 대하여, 주어진 함수(callback)를 호출한 결과를 모아서, 새로운 배열을 반환합니다.
- 사용방법: arr.map(callback(element,index...)[this.args])
const numbers= [1,2,3,4,5,6,7]
const TwoTimesLarge = numbers.map((number) => number*2)
console.log(TwoTimesLarge)
배열의 조건을 만족하는 원소가 있는지 없는지 확인
배열 안에 있는지 없는지 True/false 값만 알고 싶은 상황이 있습니다. 그럴 때, 유용하게 이용할 수 있습니다.
2가지가 준비되어 있습니다. some을 응용해서 every를 만들어낼 수 있지만, 별로 직관적이지 못한 방법입니다.
// check multiple of 3
const number =[1,2,3,4,5,6,7]
some()
- 배열 안의 어떤 요소라도, 주어진 판별 함수를 통과하는지 테스트 합니다.
- 하나라도 만족하는 것이 있다면 True, 없다면 False입니다.
const array =[1,2,3,4,5,6]
const multipleOf3 = (number) => number%3===0;
console.log(array.some(multipleOf3))
every()
- 배열 안의 모든 요소가 주어진 판별 함수를 통과하는지 테스트합니다.
- 즉, 모든 요소가 만족한다면 True,하나라도 틀리면 false입니다.
const number = [1,2,3,4,5,6,7]
const multipleOf3 = (number) => number %3===0
console.log(number.every(multipleOf3))
배열의 탐색을 재귀적으로 하기
사용하다보면, 배열의 return값을 그대로 다시 쓰고싶은 경우가 있습니다. 예를들어, 모든 배열의 합을 구하는 경우가 그렇습니다.
// sum
const numbers=[1,2,3,4,5,6,7]
Reduce()
- 배열의 각 요소에 대해 주어진 리듀서 함수를 실행하고, 하나의 결과값을 반환 합니다.
- 사용방법: arr.reduce(callback[,initialValue])
- 리듀서 함수는 acc(누산기),cur(현재값),idx(인덱스),src(원본배열) 4가지 인자를 가집니다.
const numbers=[1,2,3,4,5,6,7,8]
numbers.reduce((prev,cur) => prev+cur,0) //36
Tips) 물론, 변수 하나를 선언해서 누적해도 되지만, reduce의 강력한 점은 "로직"또한 누적시킬 수 있다는 겁니다.
reduce로 감싸서, 여러가지 로직을 쭉 펼치는 "go"의 개념에도 reduce가 사용됩니다만, JS에서는 누산하여 하나로 합치는 느낌으로 쓰셔도 무방합니다.
위의 함수들은 조합해서 쓸 수 있습니다.
예를들어, 아래와 같은 쇼핑몰 리스트가 있다고 합시다.
- 5천원 후드티
- 만원 코트
- 3천원 청바지
const items = [
{id:"1",price:5000,name:"hoody"},
{id:"2",price:10000,name:"coat"},
{id:"3",price:3000,name:"jeans"},
]
제가, 5000원 이상인 품목의 이름을 알고싶다면 , 어떻게 할 수 있을까요. 아래와 같이 적을 수 있지 않을까요!
items
.filter((item) => item.price>=5000)
.map((i) =>i.name)
'Web Front-end > JavaScript' 카테고리의 다른 글
[JS/호이스팅/실행 컨텍스트/이벤트 루프] JS 코드의 흐름 (0) | 2022.10.19 |
---|---|
[JS/this/호출스택] JS의 This 정리 (호출스택,This) (0) | 2022.10.17 |
[JS/배열/Method/Array] Array를 잘 다루어보자! (1) | 2022.10.13 |
[JS/Basic/배열/Array] 자바스크립트의 배열 (0) | 2022.08.23 |
[JS/Event/Pattern] 자바스크립트 이벤트 버블링(Event Bubbling)과 이벤트 위임(Event Delegation) (0) | 2022.08.22 |