: 함수를 인수로 전달받거나 함수를 반환하는 함수
: 순수함수와 보조 함수의 조합을 통해 로직 내에 존재하는 존건문과 반복문을 제거하여 복잡성을 해결하고 변수의 사용을 억제하여 상태 변경을 피하려는 프로그래밍 패러다임
배열을 기본적으로 오름차순으로 요소를 정렬하며 원본 배열을 직접 변경하며 정렬된 배열을 반환한다.
const fruits = ['Banana','Orange','Apple'];
//오름차순으로 정렬
fruits.sort();
console.log(fruits); //['Apple','Banana','Orange']
//내림차순으로 정렬
fruits.reverse();
console.log(fruits); //['Orange','Banana','Apple']
유니코드 코드 포인트 순서
를 따른다. 하지만 숫자는 유니코드가 일반 숫자 순서와 다르기때문에 예상치 못한 결과를 받을 수 있다.const points = [40, 100, 1, 5, 2, 25, 10];
//숫자 배열을 오름차순 정렬.
//비교 함수의 반환값이 0보다 작으면 a를 우선 정렬한다.
points.sort((a,b) => a - b);
console.log(points); //[1,2,5,10,25,40,100]
//숫자 배열에서 최소/최대값 취득
console.log(points[0],points[points.length -1]); //100
//숫자 배열의 내림차순 정렬
//비교 함수의 반환값이 0보다 작으면 b를 우선하여 정렬한다.
points.sort((a,b) => b - a);
console.log(points); //[100, 40, 25, 10, 5, 2, 1]
for문을 대체할 수 있는 고차함수이며,
반복문을 추상화한 고차함수로서 내부에서 반복문을 통해 자신을 호출한 배열을 순회하면서 수행해야 할 처리를 콜백함수로 전달 받아 호출한다.
- forEach메서드의 매개변수 (2) : 콜백함수, 콜백함수 내부의 this지정
- 콜백함수의 매개변수 (3) : 요소값, 인덱스, forEach 메서드를 호출한 배열 자체(this)
const number = [1,2,3];
const pows = [];
number.forEach(item => pow.push(item ** 2));
console.log(pow); //[2,4,9]
undefined
이다.cosnt result = [1,2,3].forEach(console.log);
console.log(result); //undefined
//희소배열
const arr = [1, ,3];
//for문으로 희소 배열을 순회
for(let i = 0; i < arr.length; i++){
console.log(arr[i]); //1 undefined 3
}
//forEach메서드는 희소배열의 존재하지 않는 요소를 순회대상에서 제외한다.
arr.forEach(v => console.log(v)); //1,3
class Numbers{
numberArray = [];
multiply(arr){
arr.forEach(function(item){
this.numberArray.push(item * item);
},this);
//this를 기정하지 않으면 forEach를 통해 호출된 콜백 함수는 일반 함수로 불러오게 되어서 this의 값이 undefined가 된다.
//그 이유는 클래스 내부의 모든 코드에는 암묵적으로 strict mode가 적용되기 때문이다.
}
}
const number = new Numbers();
numbers.mutiply([1,2,3]);
conosole.log(number.nuberArray); //[1,4,9]
class인 경우에는 클래스 내부는 strict mode가 되어 this가 undefined가 되어 원하는 값을 도출해 낼 수 없다. 따라서 this를 forEach문의 두번째 인수로 전달해 콜백함수 안에 this를 일치 시켜준다.
class Numbers{
numberArray = [];
multiply(arr){
arr.forEach((item)=>this.numberArray.push(item * item);
}
}
const number = new Numbers();
numbers.mutiply([1,2,3]);
conosole.log(number.nuberArray); //[1,4,9]
화살표 함수는 this 바인딩을 가지지 않기 때문에 this를 찾기 위해서 상위 스코프의 this를 참조한다.
자신을 호출한 배열의 모든 요소를 순회하면서 인수로 전달 받은 콜백 함수를 반복 호출한다. 콜백함수의 반환값들로 구성된 새로운 배열을 반환한다.
- map의 매개변수(2): 콜백함수, 콜백 함수 내부의 this지정 객체
- 콜백함수의 매개변수(3) : map메서드를 호출한 배열의 요소값, 인덱스, map메서들 호출한 배열(this)
const numbers = [1,4,9];
const roots = numbers.map(item => Math.sqrt(item));
console.log(roots); //[1,2,3]
console.log(numbers); //[1,4,9]
forEach와 map은 배열의 모든 요소를 순회하여 인수로 전달받은 콜백함수를 반복 호출하는 것은 같으나, 반환값이 forEach는 undefined
이며, map은 콜백함수 반환값인 배열
을 반환하는 차이점이 있다.
모든 요소를 순회하면서 콜백함수의 반홤값이 true인 요소로만 구성된 새로운 배열을 반환한다.(값이 true인 결과만 추출하여 배열에 넣는다)
- filter의 매개변수(2) : 콜백함수, filter메서드의 콜백함수 내부에서 this로 사용할 객체
- 콜백 함수의 매개변수(3) : filter를 호출한 배열의 요소, 인덱스값, filter를 호출한 배열(this)
const number = [1,2,3,4,5];
const odds = numbers.filter(item => item % 2);
console.log(odds); //[1,3,5]
//item % 2는 짝수인 요소들은 나머지가 0이 된다.
//0은 false이므로, filter에 의해 걸러져 홀수들이 출력된다.
class Users{
constructor(){
this.users = [
{id : 1, name : 'kim'},
{id : 2, name : 'Lee'}
];
//요소 추출
findById(id){
//id가 일치하는 사용자만 반환한다.
return this.users.filter(users => users.id === id);
}
//요소 제거
remove(id){
//id가 일치하면 제거한다.
return this.users.filter(users => users.id !== id);
}
}
const users = new Users();
let user = users.findById(1);
console.log(user); //[{id : 1, name: 'kim'}];
user = users.remove(1);
user = users.findById(1);
console.log(user); //[]
참고 : 특정 요소를 하나만 제거하고 싶다면 indexOf메서드와 splice를 통해 제거하면 된다.
모든 요소를 순회며 콜백함수의 반환값을 다음 순회 시에 콜백 함수의 첫번째 인수로 전달하면서 콜백 함수를 호출하여 하나의 결과값을 만들어 반환한다.
- reduce메서드의 매개변수(2) : 콜백함수, 초기값
- 콜백함수의 매개변수(4) : 초기값 또는 콜백 함수의 이전 반환값, reduce메서드를 호출한 배열의 요소값, 인덱스, reduce메서드를 호출한 배열자체(this)
//1부터 4까지 누적을 구한다.
const sum = [1,2,3,4].reduce((accumulator, currentValue, index, arr) => accmulator + cuurentValue, 0);
console.log(sum); //10
const produce = [
{id : 1, price : 100},
{id : 2, price : 200},
{id : 3, price : 300}
];
//1번 순회시 acc는 {id : 1, price : 100}, cur은 {id : 2, price : 200}이고
//2번 순회시 acc 300이고 cur은 {id : 3, price : 300}dlek.
//2번 순회 시 acc에 함수에 객체가 아닌 숫자값이 전달되는데 이때 acc.price의 값은 undefined가 되어 값이 나오지 않는다.
const priceSum = produce.reduce((acc,cur) => arr.price + cur.price);
console.log(priceSum); //NaN
따라서 초기값을 세팅해두면 acc의 값은 숫자가 되어 계산 결과를 도출 할 수 있다.
const produce = [
{id : 1, price : 100},
{id : 2, price : 200},
{id : 3, price : 300}
];
//1번 순회 acc : 0 , cur => {id : 1, price : 100}
//2번 순회 acc : 100 , cur => {id : 2, price : 200}
//3번 순회 acc : 300 , cur => {id : 3, price : 300}
const priceSum = produce.reduce((acc,cur) => arr + cur.price, 0);
console.log(priceSum); //600
호출한 배열의 모든 요소를 순회하며, 콜백함수의 반환값이 단 번이라도 참이면 true, 모두 거짓이면 false를 반환한다.
- 콜백 함수의 매개변수(3) : 배열의 요소 값, 인덱스, some메서드를 호출한 배열(this)
//배열의 요소 중 10보다 큰 요소가 1개 이상 존재하는지 확인
[5,10,15].some((item)=> item > 10); //true
//배열의 요소 중 0보다 작은 요소가 1개 이상 존재하는지 확인
[5,10,15].some(item => item < 0); //false
//배열의 요소 중 'banana'가 1개 이상 존재하는지 확인
['apple', 'banana', 'mango'].some(item => item === 'banana'); //true
//some 메서드를 호출한 배열이 빈 배열인 경우 언제나 false를 반환한다.
[].some(item => item > 3); //false
호출한 배열의 요소를 순회하면서 콜백 함수의 반환값이 모두 참이면 true, 단 한번도 거짓이면 false를 반환한다.
//배열의 모든 요소가 3보다 큰지 확인
[5, 10, 15].every(item => item >3); //true
//배열의 모든 요소가 10보다 큰지 확인
[5, 10, 15].every(item => item > 10); //false
//every메서드를 호출한 배열이 빈 배열인 경우 언제나 true
[].every(item => item >3); //true
호출한 배열의 요소를 순회하며, 콜백함수를 호출하여 반환값이 true인 첫번째 요소를 반환한다.
- find메서드의 매개변수(2) : 콜백 함수, this
const users = [
{id : 1 name : 'Lee'},
{id : 2, name : 'kem'},
{id : 3 name : 'choi'},
{id : 4 name : 'Park'}
];
user.find(user => user.id === 2); //{id : 2, name : 'Kim'}
//find메서드는 첫번째인 true 요소를 반환한다.
[1,2,2,3].find(item => item ===2); //2
호출한 배열의 요소를 순회하며, 콜백함수를 호출하여 반환값이 true인 첫번째 요소의 인덱스를 반환한다.
- find메서드의 매개변수(2) : 콜백 함수, this
const users = [
{id : 1 name : 'Lee'},
{id : 2, name : 'kem'},
{id : 3 name : 'choi'},
{id : 4 name : 'Park'}
];
user.findIndex(user => user.id === 2); // 1
map메서드를 통해 생성된 새로운 배열을 평탄화한다.
- map메서드와 flatMap메서드를 순차적으로 실행하는 효과가 있다.
const arr = ['hello', 'world'];
arr.flatMap(x => x.split(''));
//['h','e','l','l','o','w','o','r','l','d']