๐ JavaScript ๋ฐฐ์ด ๊ณ ์ฐจ ํจ์ ์ด์ ๋ฆฌ
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ๊ณ ์ฐจํจ์
์ฌ๋ฌ๋ถ์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ฐ๋ ์ค์ด๋ผ๋ฉด, ๊ณ ์ฐจ ํจ์(Higher-Order Function) ๋ผ๋ ์ฉ์ด๋ฅผ ์ผํ ๋ค์ด๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค.
๊ณ ์ฐจ ํจ์๋, ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ๊ฑฐ๋ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ก ๋ฐํํด์ฃผ๋ ๋ฉ์๋๋ฅผ ์ผ์ปซ๋๋ค. ์์ฆ ์์ฃผ ๊ฑฐ๋ก ๋๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ด๊ธฐ๋ ํ๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์๋ง์ ์ธ์ด๋ก ๋ง๋ค์ด์ฃผ๋ ํน์ฑ์ด๊ธฐ๋ ํ๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋?
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธธ ์๋ ์๊ณ ๋ฐํ(return) ๊ฐ์ผ๋ก ํจ์๋ฅผ ๋ฐ์ ์๋ ์๋ ํ๋ก๊ทธ๋๋ฐ ํํ๋ฅผ ๋งํ๋ค. ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์, ๊ฐ๋ฐ์๋ ํจ์๋ผ๋ ์ฉ์ด ํ์์ ์๊ฐํ๊ณ ์ฝ๋ฉํ๊ฒ ๋๋ค.
์ด๋ฒ ์๊ฐ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ด๋ฒ์ ํ๊ฒ ์ฌ์ฉ๋๋ ๋ฐฐ์ด์ ๊ณ ์ฐจํจ์๋ฅผ ์ด์ ๋ฆฌ ํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ ๋ณด๊ฒ ๋ค. ๋๊ฐ์ด ๋ฐฐ์ด์ ์ํํ๋ค๋ ์ ์์ ์ด๋ค์ ๋ชจ๋ ๋น์ทํ์ง๋ง ๋ฆฌํดํ๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๊ธฐ ๋ค๋ฅด๋ ์ด๋ฅผ ์ ์ฌํ ๋ณด๋ฉฐ ์ตํ๋ ๊ฒ์ ๊ถํ๋ค.
.forEach()
for๋ฌธ์ ๋์ฒดํ๋ ๊ณ ์ฐจ ํจ์.- ๋ฐ๋ณต๋ฌธ์ ์ถ์ํํ์ฌ ๊ตฌํ๋ ๋ฉ์๋์ด๊ณ ๋ด๋ถ์์ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ํํ๋ฉด์ ์ฐ์ฐ์ ์ํ
const numberArr = [1, 2, 3, 4, 5];
let total = 0;
numberArr.forEach((item) => {
total += item;
});
console.log(total); // 15
.map()
forEach๊ฐ์ด ์ํํ๋ฉด์, ์ฝ๋ฐฑํจ์์์์ ์คํ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ฐํ
const numberArr = [1, 2, 3, 4, 5];
const numberMapArr = numberArr.map((item) => {
return (item % 2 === 0) ? 'even' : 'odd'; // ์ฐ์ฐํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฃ์ด ๋ฐฐ์ด ๋ฐํ
});
console.log(numberMapArr); // ['odd', 'even', 'odd', 'even', 'odd']
[ forEach์ map์ ์ฐจ์ด ]
โ๋ ๋ฉ์๋ ๋ชจ๋ ๋ฐฐ์ด์ ์ํํ๋ ๊ฒ์ ๋์ผํ์ง๋ง,forEach()์ ๊ฒฝ์ฐ ๊ฐ ์์๋ฅผ ์ฐธ์กฐํ ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง๊ณmap()์ ๊ฒฝ์ฐ์ ๊ฐ ์์๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋งตํํ ์๋ก์ด ๋ฐฐ์ด์ด ๋ฐํ๋๋ ์ ์ ์ฐจ์ด๊ฐ ์๋ค.
โ
์ ๋ฆฌํ๋ฉดforEach()๋ for๋ฌธ์ ๋์ฒดํ์ฌ ์ฌ์ฉํ๊ณmap()์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ก ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ๊ณ ์ํ ๋ ์ฌ์ฉ๋๋ค.
.find()
indexOf()๊ฐ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ ์ธ๋ฑ์ค๋ก ์ฃผ๋๊ฑฐ๊ณ ,include()๊ฐ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ Bool๋ก ์ฃผ๋๊ฑฐ๋ฉด,find()๋ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ ๊ทธ๋๋ก ๋ฐํํ๋ค- ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ํํ๋ฉด์ ์ฝ๋ฐฑ ํจ์ ์คํ์ ๋ฐํ๊ฐ์ด true์ ํด๋นํ๋ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๋ฐํ
const numberArr = [1, 3, 3, 5, 7];
const objectArr = [
{ name: 'Harry', age: 20 },
{ name: 'Kim', age: 30 },
{ name: 'Steve', age: 40 }
];
console.log(objectArr.find(item => {
return item.age === 20 // ํด๋น์กฐ๊ฑด์ ๋ถํฉํ๋ฉด item๊ฐ ๋ฐํ
}); // {name: "Harry", age: 20}
// find๋ ํ๋๋ง ์ฐพ์. ๋ค์์ ๋ฐฐ์ธ filter์ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ฐฐ์ด๋ก
console.log(numberArr.find(item => item === 3)); // 3
console.log(numberArr.filter(item => item === 3)); // [3, 3]
.findIndex()
- ๋ฐฐ์ด ๋ฉ์๋
indexOf()์ ์ฝ๋ฐฑํจ์ ๋ฒ์ ผ. - ๊ณ ์ฐจํจ์
find()์ ๋ฆฌํด๊ฐ์ด ์ธ๋ฑ์ค์ธ ๋ฒ์ ผ.
const objectArr = [
{ name: 'Harry', age: 20 },
{ name: 'Kim', age: 30 },
{ name: 'Steve', age: 40 }
];
console.log(objectArr.findIndex(item => {
return item.age === 20 // ํด๋น์กฐ๊ฑด์ ๋ถํฉํ๋ฉด item์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํ
}); // 0
console.log(objectArr.findIndex(item => item.name === 'Kim')); // 1
.filter()
- ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ํํ๋ฉด์ ์ฝ๋ฐฑ ํจ์์ ๋ฐํ๊ฐ์ด true์ ํด๋นํ๋ ์์๋ก๋ง ๊ตฌ์ฑ๋ ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ์ฌ ๋ฐํ.
- ํ๋ง๋๋ก
find()์ ์ฐพ์์ ๊ฐ์ ๋ฐํํ๋ ๊ธฐ๋ฅ๊ณผmap()์ ๋ฐฐ์ด ์์ฑ ๊ธฐ๋ฅ์ ์ตํฉ ๋ฒ์ ผ.
const numberArr = [1, 2, 3, 4, 5];
const numberFilterArr = numberArr.filter((item) => {
return item % 2 === 0; // ํด๋น์กฐ๊ฑด์ ๋ถํฉ์ผ๋ฉด item์ ๋ฃ์ด ๋ฐฐ์ด ๋ฐํ
});
console.log(numberFilterArr); // [2, 4]
.reduce()
- ์ฝ๋ฐฑ ํจ์์ ์คํ๋ ๋ฐํ๊ฐ(initialValue)์ ์ ๋ฌ ๋ฐ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ด ๋ฐํ.
- ์ฒซ๋ฒ์งธ ์ธ์(accumulator)์๋ถํฐ ์์ํด์ ๋ฐฐ์ด๊ฐ์ธ ๋๋ฒ์งธ ์ธ์(currentvalue) ์ ์ํํ๋ฉฐ
accumulator+=currentvalue์ ์คํ. - ์ฌ์ค์
forEach,map,filter๊ธฐ๋ฅ์reduce๋ก ๋ชจ๋ ๊ตฌํํด์ ์ธ์ ์์ด ๊ณ ์ฐจํจ์์ ๋ถ๋ชจ๋ผ๊ณ ๋ถ๋ฆผ
reduce()ํจ์ ํธ์ถ์ initialValue ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
- accumulator : ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ๊ฐ
- currentValue : ๋ฐฐ์ด์ ๋๋ฒ์งธ ๊ฐ
โ
reduce()ํจ์ ํธ์ถ์ initialValue ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
- accumulator : initialValue๊ฐ ์ง์ ํ ๊ฐ
- currentValue : ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ๊ฐ
const numberArr = [1, 2, 3, 4, 5];
const sum = numberArr.reduce((previousValue, currentValue, currentIndex, thisArray) => {
console.log('Current Index: ' + currentIndex + ' / Previous Value: ' + previousValue + ' / Current Value: ' + currentValue);
return previousValue + currentValue; // ์ฐ์ฐํ ๊ฒฐ๊ณผ๊ฐ์ ๋์ฐ๊ธฐpreviousValue์ ๋ฃ์ด ์ต์ข
๊ฐ์ ์ป๋๋ค.
}, 0);
console.log('Sum: ' + sum);
/*
Current Index: 0 / Previous Value: 0 / Current Value: 1
Current Index: 1 / Previous Value: 1 / Current Value: 2
Current Index: 2 / Previous Value: 3 / Current Value: 3
Current Index: 3 / Previous Value: 6 / Current Value: 4
Current Index: 4 / Previous Value: 10 / Current Value: 5
Sum: 15
*/
ํธ์ถ ์์ | previousValue | currentValue | currentIndex | thisArray | ์ฝ๋ฐฑ ํจ์ ๋ฐํ๊ฐ |
1 | 0 | 1 | 0 | [1, 2, 3, 4, 5] | 1 |
2 | 1 | 2 | 1 | [1, 2, 3, 4, 5] | 3 |
3 | 3 | 3 | 2 | [1, 2, 3, 4, 5] | 6 |
4 | 6 | 4 | 3 | [1, 2, 3, 4, 5] | 10 |
5 | 10 | 5 | 4 | [1, 2, 3, 4, 5] | 15 |
.sort()
- ๋ฐฐ์ด ์ ๋ ฌ.
- ๋จ, ๋ณต์ฌ๋ณธ์ด ๋ง๋ค์ด์ง๋๊ฒ ์๋๋ผ ์ ๋ฐฐ์ด์ด ์ ๋ ฌ๋จ.
- ์ฝ๋ฐฑ ํจ์๋ฅผ ํตํด ๋ฐฐ์ด์ ์์๋ค์ ์ด๋ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ์ง ์ง์ ํด์ผํจ (๋ฒ๊ฑฐ๋ก์)
var arr = ['red', 'blue', 'green', 'white', 'black'];
arr.sort(); // [ 'black', 'blue', 'green', 'red', 'white' ]
โ์์ ๊ฐ์ด ๋ฌธ์๋ฅผ ์ ๋ ฌํ ๋๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, ์ซ์๋ฅผ ์ ๋ ฌํ๋ ๊ฒฝ์ฐ์๋ ABC ์์ผ๋ก ์ ๋ ฌ์ด ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋ฐฑํจ์๋ฅผ ๋ฃ์ด ์กฐ์์ด ํ์ํ๋ค.
์๋์ ๊ฐ์ด, ์ฝ๋ฐฑํจ์์์ ์ธ์ ๋๊ฐ๋ฅผ ๋ฐ์, ๋ ์์ ์ฐจ๊ฐ ์์๊ฐ(ํฐ๊ฐ)์ด๋ ์์๊ฐ(์์๊ฐ)์ด๋๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฌํ๋ค.
var arr2 = [1,2,3,10,50,70,8,4];
arr2.sort(); // [ 1, 10, 2, 3, 4, 50, 70, 8 ]
arr2.sort(function(a, b) {
console.log(a,b);
});
/*
10 1
2 10
3 2
4 3
50 4
70 50
8 70
*/
arr.sort(function(a, b) {
if(a > b) return 1;
if(a === b) return 0;
if(a < b) return -1;
}); // [ 1, 2, 3, 4, 8, 10, 50, 70 ]
๐ ์ซ์ ์ ๋ ฌ
const arr = [2, 1, 3, 10];
arr.sort(function(a, b) {
return a - b;
}); // [1, 2, 3, 10] ์ค๋ฆ์ฐจ์
arr.sort(function(a, b) {
return b - a;
}); // [10, 3, 2, 1] ๋ด๋ฆฝ์ฐจ์
โ
๐ ๋ฌธ์ ์ ๋ ฌ
const arr = ['banana', 'b', 'boy'];
arr.sort(); // ['b', 'banana', 'boy']
arr.sort(function(a, b) {
if(a < b) return 1;
if(a > b) return -1;
if(a === b) return 0;
}); // ['boy', 'banana', 'b'] ๋ด๋ฆผ์ฐจ์
โ
๐ ๋ฌธ์(๋์๋ฌธ์ ๊ตฌ๋ถ์์ด) ์ ๋ ฌ
const arr = ['banana', 'b', 'Boy'];
arr.sort(); // ['Boy','b','banana']
// sort() ํจ์๋ก ๋ฌธ์์ด์ ์ ๋ ฌํ๋ฉด, ๋๋ฌธ์๊ฐ ์๋ฌธ์๋ณด๋ค ์์ ์ค๋๋ก ์ ๋ ฌ์ด ๋ฉ๋๋ค.
// ์ ๋์ฝ๋๊ฐ ๋๋ฌธ์๊ฐ ์๋ฌธ์๋ณด๋ค ์์๊ธฐ ๋๋ฌธ์
๋๋ค.
arr.sort(function(a, b) {
const upperCaseA = a.toUpperCase();
const upperCaseB = b.toUpperCase();
if(upperCaseA > upperCaseB) return 1;
if(upperCaseA < upperCaseB) return -1;
if(upperCaseA === upperCaseB) return 0;
}); // ['b', 'banana', 'Boy'] ์ค๋ฆ์ฐจ์
arr.sort(function(a, b) {
const upperCaseA = a.toUpperCase();
const upperCaseB = b.toUpperCase();
if(upperCaseA < upperCaseB) return 1;
if(upperCaseA > upperCaseB) return -1;
if(upperCaseA === upperCaseB) return 0;
}); // ['Boy', 'banana', 'b'] ๋ด๋ฆผ์ฐจ์
โ
๐ ๊ฐ์ฒด ์ ๋ ฌ
const arr = [
{name: 'banana', price: 3000},
{name: 'apple', price: 1000},
{name: 'orange', price: 500}
];
arr.sort(function(a, b) {
return a.price - b.price; // price ์ซ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
});
/*
{"name":"orange","price":500}
{"name":"apple","price":1000}
{"name":"banana","price":3000}
*/
.some()
- ๋ฐฐ์ด ๋ฉ์๋์ธ
include()์ ์ฝ๋ฐฑํจ์ ๋ฒ์ . include๋ ๊ฐ์ด ์๋์ ๋ฐ๋ฅธ bool์ด๋ฉด,some์ ํจ์์ ๋ก์ง์ ๋ฐ๋ฅธ bool.- ๋ฐฐ์ด์ ์์๋ค์ ์ฃผ์ด์ง ํจ์(์กฐ๊ฑด)์ ํต๊ณผํ๋๋ฐ ํ๊ฐ๋ผ๋ ํต๊ณผ๋๋ฉด true, ์๋๋์๋ false๋ฅผ ์ถ๋ ฅ.
- ๋น ๋ฐฐ์ด๋ก ํจ์(์กฐ๊ฑด)์ ํต๊ณผํ๋ฉด ๋ฌด์กฐ๊ฑด false๋ฅผ ์ถ๋ ฅ.
- ์ด์๊ฐ์ด some์ด๋ผ๋ ์ด๋ฆ์, ํจ์(์กฐ๊ฑด)์ ๋ถํฉํ ๊ฐฏ์๊ฐ some์ด๋ฉด true๋ผ๋ ๋ป์์ ๋น๋กฏ๋จ.
const array = [1, 3, 5];
// ์ง์์ธ์ง ์ฒดํฌ
const result = array.some((currentValue) => {
return currentValue % 2 === 0;
})
console.log(result); // ๋ฆฌํด ๊ฐ : false
// ๊ทธ ์ด์ ๋ array์ 3๊ฐ์ ์์ ๋ชจ๋ 2๋ก ๋๋๋ ๋๋จธ์ง๊ฐ 0์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
// ํ๋๋ผ๋ ๋ถํฉํ ์กฐ๊ฑด์ ๋ง์ผ๋ฉด true, ๋ชจ๋ ๋ถํฉํ์ง ์์ผ๋ฉด false
// -----------------------------------------------
const array2 = [1, 2, 3, 5];
const result2 = array2.some((currentValue) => {
return currentValue % 2 === 0;
})
console.log(result2); // ๋ฆฌํด ๊ฐ : true
// ๊ทธ ์ด์ ๋ array์ 4๊ฐ์ ์์ ๋ชจ๋ 2๋ก ๋๋๋ ๋๋จธ์ง๊ฐ 0์ธ ์์๊ฐ ํ๋๋ผ๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
// ํ๋๋ผ๋ ๋ถํฉํ ์กฐ๊ฑด์ ๋ง์ผ๋ฉด true, ๋ชจ๋ ๋ถํฉํ์ง ์์ผ๋ฉด false
.every()
some()์ ๋ฐ๋ ๋ฒ์ - ๋ฐฐ์ด์์ ๋ชจ๋ ์์๊ฐ ์ฃผ์ด์ง ํจ์(์กฐ๊ฑด)์ ๋ชจ๋ ํต๊ณผํ๋ฉด true, ํ ์์๋ผ๋ ํต๊ณผํ์ง ๋ชปํ๋ฉด false๋ฅผ ์ถ๋ ฅ.
- ๋น ๋ฐฐ์ด์ ํจ์์ ์ ์ฉ์ํค๋ฉด ๋ฌด์กฐ๊ฑด true๋ฅผ ๋ฐํ.
- ์ด์๊ฐ์ด every์ด๋ผ๋ ์ด๋ฆ์, ํจ์(์กฐ๊ฑด)์ ๋ถํฉํ ๊ฐฏ์๊ฐ every์ด๋ฉด true๋ผ๋ ๋ป์์ ๋น๋กฏ๋จ.
const array = [1, 30, 39, 29, 13];
const result = array.every((currentValue) => {
return currentValue < 40;
})
console.log(result); // ๋ฆฌํด ๊ฐ : true
// ๊ทธ ์ด์ ๋ array์ ๋ชจ๋ ์์๊ฐ 40๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ด๋ค.
// ํ๋๋ผ๋ ๋ถํฉํ ์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด false, ๋ชจ๋ ๋ถํฉํ๋ฉด true
// -----------------------------------------------
const array2 = [1, 30, 39, 29, 100, 13];
const result2 = array2.every((currentValue) => {
return currentValue < 40;
})
console.log(result2); // ๋ฆฌํด ๊ฐ : false
// ๊ทธ ์ด์ ๋ array์ 1๊ฐ์ ์์ 100์ด 40๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ด๋ค.
// ํ๋๋ผ๋ ๋ถํฉํ ์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด false, ๋ชจ๋ ๋ถํฉํ๋ฉด true
# ์ฐธ๊ณ ์๋ฃ