1.1 내장고차함수란
2.1 map
2.2 reduce
2.3 filter
2.4 forEach
2.5 sort
2.6 some
2.7 every
2.8 find
2.9 findIndex
자바스크립트에는 기본적으로 내장된 고차함수가 여럿 있습니다.
그중에서 배열 메소드들 중 일부가 대표적인 고차함수에 해당합니다.
<function 함수형태>
배열.method(function(변수){
return 조건 })
<화살표 함수형태>
배열.method((변수) => 조건))
데이터인 배열의 활용은 앞으로 많이 쓰일것으로 보인다. 따라서 이러한 배열을 활용한 method를 하나씩 학습하여 필요한 적재적소에 쓸수 있도록 해보자
const array1 = [1, 4, 9, 16]
const map1 = array1.map(x => x * 2);
console.log(map1); // [2, 8, 18, 32] 각 index에 2가 곱해졌다.
const array2= [
{name: 'baek',age: 26},
{name: 'kim', age:30},
{name: 'Pakr', age:23}
]
map2 = array2.map(function(x){return x.name})
console.log(map2) //각 index객체의 key(name)값을 호출한다.
reduce함수는 네 개의 인자를 가집니다.
1.누산기 (acc)
2.현재 값 (cur)
3.현재 인덱스 (idx)
4.원본 배열 (src)
reduce 함수의 반환 값은 누산기에 할당되고, 누산기는 순회 중 유지되므로 결국 최종 결과는 하나의 값이 됩니다.
const array = [0, 1, 2, 3, 4]
const result = array.reduce(function(acc, cur) {
return acc + cur;});
result // 10
호출순서 | acc | cur | 반환값 |
---|---|---|---|
1 | 0 | 1 | 1 |
2 | 1 | 2 | 3 |
3 | 3 | 3 | 6 |
4 | 6 | 4 | 10 |
const array = [0, 1, 2, 3, 4]
const result = array.reduce(function(acc, cur) {
return acc + cur;},10); //초기값으로 10을 주었을 경우
result // 20
호출순서 | acc | cur | 반환값 |
---|---|---|---|
1 | 10 | 1 | 11 |
2 | 11 | 2 | 13 |
3 | 13 | 3 | 16 |
4 | 16 | 4 | 20 |
const array2= [
{name: 'baek',age: 26},
{name: 'kim', age:30},
{name: 'Pakr', age:23}
]
array2.reduce(function(el,ele){
return el + ele.age},0) // 0부터 각 객체의 age값을 전부 더한다.
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);//글자크기가 6이하면 버린다.
console.log(result); //["exuberant", "destruction", "present"]
각 요소를 함수를 통해 시험하고 true를 반환하면 요소를 유지하고, false를 반환하면 버립니다.
const array2= [
{name: 'baek',age: 26,gender:'male'},
{name: 'kim', age:30,gender:'female'},
{name: 'Pakr', age:23,gender:'male'}
]
array2.filter((gender) => gender.gender === 'male')//gender의 값이 male이 아니면 버린다.
//{name: 'baek', age: 26, gender: 'male'}
//{name: 'Pakr', age: 23, gender: 'male'
let words = ['one', 'two', 'three', 'four']
words.forEach(function(word) {
console.log(word)
if (word === 'two') {
words.shift()
}
})
1. 0번째 index가 실행된다.
2. 1번째 index가 if문을 실행시킨다.
3. words의 0번째 index를 지워 words를 ['two', 'three', 'four']로 만든다.
4. words의 index가 한자리씩 당겨진다.
5. 2번째 index자리에 'four'이 되어 console에 출력된다.
Tip) forEach와 map의 차이점
각각의 index들을 호출하여 callback함수를 적용하는 두 메서드들은 진행되는 방법은 비슷하나 차이점이 존재한다.
1. Map
!)새로운 배열(Array)을 리턴한다.
!!) 기존배열을 이용해 callback함수를 인자로받아 각 요소에 대해 실행한 값을 반환한다.
2. forEach
!) callback함수를 인자로 받아서 배열의 각 욧에 콜백함수를 실행한다. 값을 return하지않는다.
!!) 제공된 함수로 Array요소를 호출한다. 이 callback은 Array를 변경할수 있으며, forEach는 구문 밖으로 return 값을 받지 못한다.
결론)
1. map은 배열을 forEach는 undefined를 return 한다.
2. forEach는 Array를 변경할수 있으나 map은 안된다.
(Num1,Num2를 변수로 받은경우)
1)두개의 변수를 사용해 return 하는값이 0보다 작을 경우, Num1이 Num2보다 앞에 위치
2)두개의 변수를 사용해 return 하는값이 0보다 클경우 , Num2가 Num1보다 앞에 위치
3)두개의 변수를 사용해 return 하는 값이 0일경우 , 현재위치 유지
const arr1 = [2, 1, 3];
arr1.sort(); // [1,2,3]
<오름차순 정렬>
const arr = [2, 1, 3, 4];
arr.sort(function(a, b) {
if(a > b) return 1;
if(a === b) return 0;
if(a < b) return -1;
}); //[1,2,3,4]
arr.sort(function(a, b) {
return a - b;
});//[1,2,3,4]
<내림차순 정렬>
arr.sort(function(a, b) {
if(a < b) return 1;
if(a > b) return -1;
if(a === b) return 0;
});//[4,3,2,1]
function isBiggerThan10(element, index, array) {
return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10); // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true
function isBiggerThan10(element, index, array) {
return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10); // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // false
Tip) some과 every 차이점
각각의 index들을 호출하여 callback함수를 적용후 Boolean값을 호출합니다.
1. some
!) true가 나올때까지 배열을 전부 확인합니다.
!!) 빈배열일 경우 false를 출력합니다.
2. every
!) false가 나올때까지 배열을 전부 확인합니다.
!!) 빈배열일 경우 true를 출력합니다.
결론)
1. 전체배열에 대한 확인 필요할 경우는 every를 찾고자하는 값이 있을경우는 some을 활용
const array2= [
{name: 'baek',age: 26},
{name: 'kim', age:30},
{name: 'Pakr', age:23}
]
array2.find(function(el){
return el.age === 30 }) // {name: 'kim', age:30}
const array2= [
{name: 'baek',age: 26},
{name: 'kim', age:30},
{name: 'Pakr', age:23}
]
array2.findIndex(function(el){
return el.age === 30 }) // 1