JavaScript ๋ฐฐ์ด ๊ณ ์ฐจ ํจ์(Higher-Order Function)
๐ ๊ณ ์ฐจ ํจ์์ ๊ธฐ๋ณธ ์ ์
- ๊ณ ์ฐจ ํจ์๋ ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ๋ฐ๊ฑฐ๋ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ก ๋ฐํํด ์ฃผ๋ ๋ฉ์๋๋ฅผ ๋งํ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์๋ง์ ์ธ์ด๋ก ๋ง๋ค์ด ์ฃผ๋ ํน์ฑ์ด๋ค.
- ๊ณ ์ฐจ ํจ์์ ๊ฐ๋ ์ ์์ ํ ์ดํดํ๊ธฐ ์ํด์๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ํผ์คํธ ํด๋์ค ํจ์์ ๊ฐ๋ ์ ์ดํดํ๋ ๊ฒ์ด ์ ํ๋์ด์ผ ํ๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธธ ์๋ ์๊ณ ๋ฆฌํด ๊ฐ์ผ๋ก ํจ์๋ฅผ ๋ฐ์ ์๋ ์๋ ํ๋ก๊ทธ๋๋ฐ ํํ์ด๋ค. ์์ ํจ์ + ๋ณด์กฐ ํจ์์ ์กฐํฉ์ผ๋ก ๋ก์ง ๋ด์ ์กด์ฌํ๋ ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ์ ์ ๊ฑฐํ์ฌ ๋ณต์ก์ฑ์ ํด๊ฒฐํ๊ณ , ๋ณ์์ ์ฌ์ฉ์ ์ต์ ํ์ฌ ์ํ ๋ณ๊ฒฝ์ ํผํ๋ ค๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋งํ๋ค. ์ฆ, ์์ ํจ์๋ฅผ ํตํด ๋ถ์ ํจ๊ณผ๋ฅผ ์ต๋ํ ์ต์ ํ์ฌ ์ค๋ฅ๋ฅผ ํผํ๊ณ ํ๋ก๊ทธ๋๋ฐ์ ์์ ์ฑ์ ๋์ด๋ ค๋ ๊ฒ์ด๋ค.
ํผ์คํธ ํด๋์ค(First-Class) ํจ์
๊ณ ์ฐจ ํจ์๋ ํ๋ผ๋ฏธํฐ๋ก ํจ์๋ฅผ ๋ฐ์์จ๋ค. ์๋ ์์๋ ๋ณ์ func์ true๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ฅผ ํ ๋นํ๋ค.
const func = function () {
return true;
};
console.log(func);
- ํํ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์๋ฅผ ํผ์คํธ ํด๋์ค ์ํฐ์ฆ(First Class Citizen)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฝ๊ฒ ๋งํ๋ฉด ๋ชจ๋ ๊ถ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ด๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์ object, string, number์ ๊ฐ์ ํ์ ์ผ๋ก ํ ์ ์๋ ๊ฒ์ ํจ์๋ก๋ ํ ์ ์๋ค. ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ค๋ฅธ ํจ์์ ๋๊ธธ ์๋ ์๊ณ , ํจ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๊ฑฐ๋ ๋ค๋ฅธ ๊ณณ์ผ๋ก ๋๊ธธ ์ ์๋ค. ์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์กด์ฌํ๋ ํจ์๋ค์ด ํผ์คํธ ํด๋์ค ํจ์๋ผ ๋ถ๋ฆฌ๋ ๊ฒ์ด๋ค.
๐ ๊ณ ์ฐจ ํจ์์ ์ข ๋ฅ
Array.prototype.forEach()
- for๋ฌธ์ ๋์ฒดํ๋ ๊ณ ์ฐจํจ์๋ก, ์ฃผ์ด์ง ํจ์๋ฅผ ๋ฐฐ์ด ์์ ๊ฐ๊ฐ์ ๋ํด ์คํํ๋ค.
arr.forEach(callback(currentvalue[, index[, array]])[, thisArg])
- callback: ๊ฐ ์์์ ๋ํด ์คํํ ํจ์
- currentValue: ์ฒ๋ฆฌํ ํ์ฌ ์์
- index: ์ฒ๋ฆฌํ ํ์ฌ ์์์ ์ธ๋ฑ์ค
- array: forEach()๋ฅผ ํธ์ถํ ๋ฐฐ์ด
- thisArg: callback์ ์คํํ ๋ this๋ก ์ฌ์ฉํ ๊ฐ, ์ ๋ฌํ์ง ์์ผ๋ฉด undefined๋ฅผ ์ฌ์ฉํ๋ค.
- ์๋ ์์๋ forEach()๋ฅผ ์ฌ์ฉํด items ๋ฐฐ์ด์ ๊ฐ๋ค์ ๋ฏธ๋ฆฌ ์ ์ธํ copy์ pushํ๋ค.
const items = ["item1", "item2", "item3"];
const copy = [];
items.forEach(function (item) {
copy.push(item);
});
console.log(copy); // [ 'item1', 'item2', 'item3' ]
const items = ["item1", "item2", "item3"];
const copy = [];
items.forEach((item) => {
copy.push(item);
});
console.log(copy); // [ 'item1', 'item2', 'item3' ]
- forEach()๋ก ์ฒ๋ฆฌํ ์์์ ๋ฒ์๋ ์ต์ด callback ํธ์ถ ์ ์ ์ค์ ํ๋ค. forEach() ํธ์ถ์ ์์ํ ๋ค ๋ฐฐ์ด์ ์ถ๊ฐํ ์์๋ callback์ด ๋ฐฉ๋ฌธํ์ง ์๋๋ค.
- ๋ฐฐ์ด์ ๊ธฐ์กด ์์๊ฐ์ด ๋ฐ๋ ๊ฒฝ์ฐ, callback์ ์ ๋ฌํ๋ ๊ฐ์ forEach()๊ฐ ์์๋ฅผ ๋ฐฉ๋ฌธํ ์์ ์ ๊ฐ์ ์ฌ์ฉํ๋ค. ๋ฐฉ๋ฌธํ๊ธฐ ์ ์ ์ญ์ ํ ์์๋ ๋ฐฉ๋ฌธํ์ง ์๋๋ค.
const items = ["item1", "item2", "item3"];
const copy = [];
items.shift();
items.forEach(function (item) {
copy.push(item);
});
console.log(copy); // [ 'item2', 'item3' ]
Array.prototype.map()
- https://trustmitt.tistory.com/4
- forEach()์ฒ๋ผ ์ํํ๋ฉด์ ์ฝ๋ฐฑ ํจ์์์์ ์คํ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ฐํํ๋ค.
arr.map(callback(currentValue[, index[, array]])[, thisArg])
- callback: ์๋ก์ด ๋ฐฐ์ด ์์๋ฅผ ์์ฑํ๋ ํจ์
- currentValue: ์ฒ๋ฆฌํ ํ์ฌ ์์
- index(Optional): ์ฒ๋ฆฌํ ํ์ฌ ์์์ ์ธ๋ฑ์ค
- array(Optional): map()์ ํธ์ถํ ๋ฐฐ์ด
- thisArg(Optional): callback์ ์คํํ ๋ this๋ก ์ฌ์ฉ๋๋ ๊ฐ
- ์๋ ์์๋ map()์ ์ฌ์ฉํด ์ฐ์ฐํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฃ์ด ๋ฐฐ์ด arr์ ๋ฐํํ๋ค.
const items = [1, 2, 3, 4];
const arr = items.map((item) => {
return item % 2 == 0 ? "even" : "odd";
});
console.log(arr); // [ 'odd', 'even', 'odd', 'even' ]
forEach()์ map()
๋ ๋ฉ์๋ ๋ชจ๋ ๋ฐฐ์ด์ ์ํํ๋ ๊ฒ์ ๋์ผํ์ง๋ง, forEach()์ ๊ฒฝ์ฐ ๊ฐ ์์๋ฅผ ์ฐธ์กฐํ ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง๊ณ , map()์ ๊ฒฝ์ฐ ๊ฐ ์์๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋งคํํ ์๋ก์ด ๋ฐฐ์ด์ด ๋ฐํ๋๋ ์ ์ ์ฐจ์ด๊ฐ ์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, forEach()๋ for๋ฌธ์ ๋์ฒดํ์ฌ ์ฌ์ฉํ๊ณ , map()์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ก ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋๋ค.
Array.prototype.find()
- find() ๋ฉ์๋๋ ์ฃผ์ด์ง ํ๋ณ ํจ์๋ฅผ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ์์์ ๊ฐ์ ๋ฐํํ๋ค.
- ๋ง์กฑํ๋ ๊ฐ์ด ์๋ค๋ฉด undefined๋ฅผ ๋ฐํํ๋ค.
arr.find(callback[, thisArg])
- callback: ๋ฐฐ์ด์ ๊ฐ ๊ฐ์ ๋ํด ์คํํ ํจ์
- element(Optional): ์ฝ๋ฐฑ ํจ์์์ ์ฒ๋ฆฌํ ํ์ฌ ์์
- index(Optional): ์ฝ๋ฐฑ ํจ์์์ ์ฒ๋ฆฌํ ํ์ฌ ์์์ ์ธ๋ฑ์ค
- array(Optional): find ํจ์๋ฅผ ํธ์ถํ ๋ฐฐ์ด
- thisArg: ์ฝ๋ฐฑ์ด ํธ์ถ๋ ๋ this๋ก ์ฌ์ฉํ ๊ฐ์ฒด
- ์๋ ์์๋ find()๋ฅผ ์ฌ์ฉํด name์ด ‘mitt’์ธ ๊ฐ์ฒด๋ฅผ ์ฐพ๋๋ค.
const arr = [
{ name: "mitt", age: 28 },
{ name: "sophie", age: 26 },
{ name: "tommy", age: 23 },
];
const result = arr.find((person) => person.name == "mitt");
console.log(result); // { name: 'mitt', age: 28 }
- callback์ 0๋ถํฐ length-1๊น์ง ๋ฐฐ์ด์ ๋ชจ๋ ์ธ๋ฑ์ค์ ๋ํด ํธ์ถ๋๋ฉฐ, ๊ฐ์ด ์ง์ ๋์ง ์์ ์์๋ ํฌํจํ๋ค.
- thisArg ํ๋ผ๋ฏธํฐ๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ์๋ thisArg๊ฐ callback ์์์ this๋ก ์ฌ์ฉ๋๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ undefined๊ฐ this๋ก ์ฌ์ฉ๋๋ค.
- find()๋ ํธ์ถ์ ๋์์ด ๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ์ง ์๋๋ค.
- find()๊ฐ ์ฒ๋ฆฌํ ๋ฐฐ์ด ์์์ ๋ฒ์๋ ์ฒซ callback์ด ํธ์ถ๋๊ธฐ ์ ์ ๊ฒฐ์ ๋๋ค. find() ๋ฉ์๋๊ฐ ์คํ๋ ์ดํ์ ๋ฐฐ์ด์ ์ถ๊ฐ๋ ์์๋ค์ ๋ํด์๋ callback์ด ํธ์ถ๋์ง ์๋๋ค.
Array.prototype.findIndex()
- findIndex() ๋ฉ์๋๋ ์ฃผ์ด์ง ํ๋ณ ํจ์๋ฅผ ๋ง์กฑํ๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค.
- ์์ ๊ธฐ์ฌํ find()๋ก ๋ฐํ๋๋ ๊ฐ์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค.
- ๋ฐฐ์ด ๋ฉ์๋ indexOf()์ ์ฝ๋ฐฑ ํจ์ ๋ฒ์ ์ด๋ค.
- ๋ง์กฑํ๋ ์์๊ฐ ์์ผ๋ฉด -1์ ๋ฐํํ๋ค.
arr.findIndex(callback(element[, index[, array]])[, thisArg])
- callback: ๋ฐฐ์ด์ ๊ฐ ๊ฐ์ ๋ํด ์คํํ ํจ์
- element: ๋ฐฐ์ด์์ ์ฒ๋ฆฌ ์ค์ธ ํ์ฌ ์์
- index: element์ ์ธ๋ฑ์ค
- array: findIndex ํจ์๊ฐ ํธ์ถ๋ ๋ฐฐ์ด
- thisArg: ์ฝ๋ฐฑ์ ์คํํ ๋ this๋ก ์ฌ์ฉ๋ ๊ฐ์ฒด
- ์๋ ์์๋ find()์ ์์์ ๋์ผํ๋ฉฐ, index ⇒ findIndex()๋ก ๊ต์ฒดํ ๊ฒ์ด๋ค.
const arr = [
{ name: "mitt", age: 28 },
{ name: "sophie", age: 26 },
{ name: "tommy", age: 23 },
];
const result = arr.findIndex((person) => person.name == "mitt");
console.log(result); // 0
Array.prototype.filter()
- filter() ๋ฉ์๋๋ ์ฃผ์ด์ง ํจ์์ ํ ์คํธ๋ฅผ ํต๊ณผํ๋ ๋ชจ๋ ์์๋ฅผ ๋ชจ์ ์๋ก์ด ๋ฐฐ์ด๋ก ๋ฐํํ๋ค.
- find()์ ๊ฐ์ ์ฐพ์ map()์ผ๋ก ๋ฐฐ์ด์ ์์ฑํ๋ ๊ฑธ ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ค.
arr.filter(callback(element[, index[, array]])[, thisArg])
- callback: ๊ฐ ์์๋ฅผ ์ํํ ํจ์, true๋ฅผ ๋ฐํํ๋ฉด ์์๋ฅผ ์ ์งํ๊ณ , false๋ฅผ ๋ฐํํ๋ฉฐ ๋ฒ๋ฆฐ๋ค.
- element: ์ฒ๋ฆฌํ ํ์ฌ ์์
- index: ํ์ฌ ์์์ ์ธ๋ฑ์ค
- array: filter๋ฅผ ํธ์ถํ ๋ฐฐ์ด
- thisArg: callback์ ์คํํ ๋ this๋ก ์ฌ์ฉํ๋ ๊ฐ
- ์๋ ์์๋ filter()๋ฅผ ์ฌ์ฉํด ์ด๋ฆ์ ‘m’ ๋ฌธ์์ด์ด ํฌํจ๋ ๊ฐ๋ค๋ก๋ง ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ ๊ฒ์ด๋ค.
const arr = ["mitt", "sophie", "tommy", "jerry"];
const filterArr = arr.filter((name) => {
return name.includes("m");
});
console.log(filterArr); // [ 'mitt', 'tommy' ]
Array.prototype.reduce()
- reduce() ๋ฉ์๋๋ ๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ๋ฆฌ๋์ ํจ์๋ฅผ ์คํํ๊ณ ํ๋์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๋ค.
- ๋ฆฌ๋์(reducer) ํจ์
- ๋์ฐ๊ธฐ(acc)
- ํ์ฌ ๊ฐ(cur)
- ํ์ฌ ์ธ๋ฑ์ค(idx)
- ์๋ณธ ๋ฐฐ์ด(src)
- ๋ฆฌ๋์ ํจ์์ ๋ฐํ ๊ฐ์ ๋์ฐ๊ธฐ์ ํ ๋น๋๊ณ , ๋์ฐ๊ธฐ๋ ์ํ ์ค ์ ์ง๋๋ฏ๋ก ๊ฒฐ๊ตญ ์ต์ข ๊ฒฐ๊ณผ๋ ํ๋์ ๊ฐ์ด ๋๋ค. ์ฒซ ๋ฒ์งธ cur๋ถํฐ ์์ํด์ ์ํํ๋ฉฐ acc += cur๋ฅผ ์คํ
- forEach, map, filter ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ตฌํํ ์ ์์ด ๊ณ ์ฐจํจ์์ ๋ถ๋ชจ๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
arr.reduce(callback[, initialValue])
- callback: ๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ์คํํ ํจ์
- accumulator: ๋์ฐ๊ธฐ๋ ์ฝ๋ฐฑ์ ๋ฐํ๊ฐ์ ๋์ ํ๋ค. ์ฝ๋ฐฑ์ ์ด์ ๋ฐํ๊ฐ ๋๋ ์ฝ๋ฐฑ์ ์ฒซ ๋ฒ์งธ ํธ์ถ์ด๋ฉด์ initialValue๋ฅผ ์ ๊ณตํ ๊ฒฝ์ฐ์๋ initialValue์ ๊ฐ์ด๋ค.
- currentValue: ์ฒ๋ฆฌํ ํ์ฌ ์์
- currentIndex: ์ฒ๋ฆฌํ ํ์ฌ ์์์ ์ธ๋ฑ์ค, initialValue๋ฅผ ์ ๊ณตํ ๊ฒฝ์ฐ 0, ์๋๋ฉด 1๋ถํฐ ์์
- array: reduce๋ฅผ ํธ์ถํ ๋ฐฐ์ด
- initialValue: callback์ ์ต์ด ํธ์ถ์์ ์ฒซ ๋ฒ์งธ ์ธ์์ ์ ๊ณตํ๋ ๊ฐ, ์ด๊ธฐ ๊ฐ์ ์ ๊ณตํ์ง ์์ผ๋ฉด ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ฌ์ฉํ๋ค. ๋น ๋ฐฐ์ด์์ ์ด๊ธฐ๊ฐ ์์ด reduce()๋ฅผ ํธ์ถํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
- ๋ฐฐ์ด์ด ๋น์ด ์๋๋ฐ initialValue๋ ์ ๊ณตํ์ง ์์ผ๋ฉด TypeError๊ฐ ๋ฐ์ํ๋ค. ๋ฐฐ์ด์ ์์๊ฐ ํ๋ ๋ฟ์ด๋ฉด์ initialValue๋ฅผ ์ ๊ณตํ์ง ์์ ๊ฒฝ์ฐ, ๋๋ initialValue๋ ์ฃผ์ด์ก์ผ๋ ๋ฐฐ์ด์ด ๋น ๊ฒฝ์ฐ์ ๊ทธ ๋จ๋ ๊ฐ์ callback ํธ์ถ ์์ด ๋ฐํํ๋ค.
- ์๋ ์์๋ reduce()๋ฅผ ์ฌ์ฉํด ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ์ ํฉ์ ๊ตฌํ ๊ฒ์ด๋ค.
const total = [1, 2, 3, 4].reduce((acc, cur) => acc + cur, 0);
console.log(total); // 10
reduce() ํธ์ถ ์ initialValue ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
- acc: ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ๊ฐ
- cur: ๋ฐฐ์ด์ ๋ ๋ฒ์งธ ๊ฐ
reduce() ํธ์ถ ์ initialValue ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
- acc: initialValue๊ฐ ์ง์ ํ ๊ฐ
- cur: ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ๊ฐ
Array.prototype.sort()
- sort() ๋ฉ์๋๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ ์ ํ ์์น์ ์ ๋ ฌํ ํ ๋ฐฐ์ด์ ๋ฐํํ๋ค. ๊ธฐ๋ณธ ์ ๋ ฌ ์์๋ ๋ฌธ์์ด์ ์ ๋์ฝ๋ ์ฝ๋ ํฌ์ธํธ๋ฅผ ๋ฐ๋ฅธ๋ค.
- ๋ฐฐ์ด ๋ณต์ฌ๋ณธ์ด ๋ง๋ค์ด์ง๋ ๊ฒ ์๋๋ผ ์ ๋ฐฐ์ด์ด ์ ๋ ฌ๋๋ค.
- ์ฝ๋ฐฑ ํจ์๋ฅผ ํตํด ๋ฐฐ์ด์ ์์๋ค์ ์ด๋ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ์ง ์ง์ ํด์ผ ํ๋ค.
arr.sort([compareFunction])
- compareFunction: ์ ๋ ฌ ์์๋ฅผ ์ ์ํ๋ ํจ์, ์๋ตํ๋ฉด ๋ฐฐ์ด์ ๊ฐ ์์์ ๋ฌธ์์ด ๋ณํ์ ๋ฐ๋ผ ๊ฐ ๋ฌธ์์ ์ ๋์ฝ๋ ํฌ์ธํธ ๊ฐ์ ๋ฐ๋ผ ์ ๋ ฌ๋๋ค.
- ์๋ ์์๋ ๋ฐฐ์ด์ ABC ์์ผ๋ก ์ ๋ ฌํ ๊ฒ์ด๋ค.
let arr = ["mitt", "sophie", "bolt", "woodie"];
arr.sort();
console.log(arr); // [ 'bolt', 'mitt', 'sophie', 'woodie' ]
- ์ซ์๋ฅผ ์ ๋ ฌํ๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์์ ๊ฐ์ด ์ ๋ ฌ๋๋ฏ๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ์ด ์กฐ์์ด ํ์ํ๋ค.
let arr = [7, 1, 24, 9, 12, 32];
arr.sort();
console.log(arr); // [ 1, 12, 24, 32, 7, 9 ]
arr.sort(function (a, b) {
return a - b;
});
console.log(arr); // [ 1, 7, 9, 12, 24, 32 ] :: ์ค๋ฆ์ฐจ์
arr.sort(function (a, b) {
return b - a;
});
console.log(arr); // [ 32, 24, 12, 9, 7, 1 ] :: ๋ด๋ฆผ์ฐจ์
- ๊ฐ์ฒด์ ์์ฑ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
let arr = [
{ name: "mitt", age: 28 },
{ name: "tommy", age: 23 },
{ name: "sophie", age: 26 },
{ name: "jerry", age: 25 },
];
arr.sort(function (a, b) {
return a.age - b.age; // age๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
});
console.log(arr);
/* [
{ name: 'tommy', age: 23 },
{ name: 'jerry', age: 25 },
{ name: 'sophie', age: 26 },
{ name: 'mitt', age: 28 }
] */
Array.prototype.some()
- some() ๋ฉ์๋๋ ๋ฐฐ์ด ์์ ์ด๋ค ์์๋ผ๋ ์ฃผ์ด์ง ํ๋ณ ํจ์๋ฅผ ํต๊ณผํ๋์ง ํ ์คํธํ๋ค.
- ํ ๊ฐ๋ผ๋ ํต๊ณผ๋๋ฉด true, ์๋ ๋์๋ false๋ฅผ ๋ฐํํ๊ณ , ๋น ๋ฐฐ์ด์์ ํธ์ถํ๋ฉด ๋ฌด์กฐ๊ฑด false๋ฅผ ๋ฐํํ๋ค.
arr.some(callback[, thisArg])
- callback: ๊ฐ ์์๋ฅผ ์ํํ ํจ์
- currentValue: ์ฒ๋ฆฌํ ํ์ฌ ์์
- index: ์ฒ๋ฆฌํ ํ์ฌ ์์์ ์ธ๋ฑ์ค
- array: some์ ํธ์ถํ ๋ฐฐ์ด
- thisArg: callback์ ์คํํ ๋ this๋ก ์ฌ์ฉํ๋ ๊ฐ
- ์๋ ์์๋ ๋ฐฐ์ด์ ์์๋ฅผ 2๋ก ๋๋์์ ๋ ๋๋จธ์ง๊ฐ 0์ธ ๊ฐ์ด ์๋์ง some() ๋ฉ์๋๋ฅผ ํตํด ์ฒดํฌํ์๋ค. ๋ฐฐ์ด์ ๋ชจ๋ ์์๊ฐ ์กฐ๊ฑด์ ๋ถํฉํ์ง ์์ false๋ฅผ ๋ฐํํ๋ค.
let arr = [1, 3, 5, 7];
let result = arr.some((cur) => {
return cur % 2 == 0;
});
console.log(result); // false
- ํ๋๋ผ๋ ์กฐ๊ฑด์ ๋ถํฉํ๋ฉด true๋ฅผ ๋ฐํํ๋ค.
let arr = [1, 3, 5, 6];
let result = arr.some((cur) => {
return cur % 2 == 0;
});
console.log(result); // true
Array.prototype.every()
- every() ๋ฉ์๋๋ ๋ฐฐ์ด ์์ ๋ชจ๋ ์์๊ฐ ์ฃผ์ด์ง ํ๋ณ ํจ์๋ฅผ ํต๊ณผํ๋์ง ํ ์คํธํ๋ค.
- some()์ ๋ฐ๋ ๋ฒ์ , ๋ฐฐ์ด ์์ ๋ชจ๋ ์์๊ฐ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ชจ๋ ํต๊ณผํ๋ฉด true, ํ ์์๋ผ๋ ํต๊ณผํ์ง ๋ชปํ๋ฉด false๋ฅผ ๋ฐํํ๋ค.
- ๋น ๋ฐฐ์ด์ ํจ์์ ์ ์ฉํ๋ฉด ๋ฌด์กฐ๊ฑด true๋ฅผ ๋ฐํํ๋ค.
arr.every(callbackFn(index[, array]])[, thisArg])
- callbackFn: ๊ฐ ์์๋ฅผ ์ํํ ํจ์
- index: ์ฒ๋ฆฌํ ํ์ฌ ์์์ ์ธ๋ฑ์ค
- array: every๋ฅผ ํธ์ถํ ๋ฐฐ์ด
- thisArg: callbackFn์ ์คํํ ๋ this๋ก ์ฌ์ฉํ๋ ๊ฐ
- ์๋ ์์๋ ๋ฐฐ์ด์ ์์๋ฅผ 2๋ก ๋๋์์ ๋ ๋๋จธ์ง๊ฐ 1์ธ์ง every() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ํ๋ณํ ๊ฒ์ด๋ค. ๋ชจ๋ ๊ฐ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ฏ๋ก true๋ฅผ ๋ฐํํ๋ค.
let arr = [1, 3, 5, 7];
let result = arr.every((cur) => {
return cur % 2 == 1;
});
console.log(result); // true
- ํ๋๋ผ๋ ์กฐ๊ฑด์ ๋ถํฉํ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค.
let arr = [1, 3, 5, 6];
let result = arr.every((cur) => {
return cur % 2 == 1;
});
console.log(result); // false
๐ ๊ณ ์ฐจ ํจ์์ ์๊ฐํ ๋น๊ต
- Array.prototype.copyWithin()
- ๋ฐฐ์ด ์ผ๋ถ๋ฅผ ๋ณต์ฌํด ์ง์ ๋ ์์น์ ๋ฎ์ด์ฐ๊ณ ํด๋น ๋ฐฐ์ด์ ๋ฐํํ๋ค.
- arr.copyWithin(target, start, end);
๐ ๊ณ ์ฐจ ํจ์์ ๋์ ์์
- ์์ 1
- ํ์ด๋ ํด๊ฐ ๋ค์ด ์๋ ๋ฐฐ์ด๋ก ์ฌ๋๋ค์ ๋์ด๋ฅผ ๊ณ์ฐํด์ ๋ฐํํ๊ณ ์ ํ๋ค.
const birthYear = [1995, 1997, 1994, 2000];
// ๊ณ ์ฐจ ํจ์๊ฐ ์๋ ํจ์
const ages1 = [];
for (let i = 0; i < birthYear.length; i++) {
let age1 = 2022 - birthYear[i];
ages1.push(age1);
}
// ๊ณ ์ฐจ ํจ์๋ก ์์ฑ -- map() ๋ฉ์๋ ์ฌ์ฉ
const ages2 = birthYear.map((year) => 2022 - year);
console.log(ages1); // [ 27, 25, 28, 22 ]
console.log(ages2); // [ 27, 25, 28, 22 ]
- ์์ 2
- ์ฌ๋๋ค์ ์ด๋ฆ๊ณผ ๋์ด๋ก ๊ตฌ์ฑ๋ ๊ฐ์ฒด ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋, 25์ด ์ด์์ ์ฌ๋๋ค๋ง ํํฐ๋ง๋ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค๊ณ ์ ํ๋ค.
const arr = [
{ name: "mitt", age: 28 },
{ name: "sophie", age: 26 },
{ name: "tommy", age: 23 },
{ name: "jerry", age: 25 },
{ name: "mayson", age: 19 },
];
// ๊ณ ์ฐจ ํจ์๊ฐ ์๋ ํจ์
const newArr1 = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i].age >= 25) {
newArr1.push(arr[i]);
}
}
// ๊ณ ์ฐจ ํจ์ -- filter() ๋ฉ์๋ ์ฌ์ฉ
const newArr2 = arr.filter((person) => person.age >= 25);
console.log(newArr1);
/* [
{ name: 'mitt', age: 28 },
{ name: 'sophie', age: 26 },
{ name: 'jerry', age: 25 }
] */
console.log(newArr2);
/* [
{ name: 'mitt', age: 28 },
{ name: 'sophie', age: 26 },
{ name: 'jerry', age: 25 }
] */
๐ ๊ณ ์ฐจ ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ด์
์ถ์ํ๋ ๋ณต์กํ ์ด๋ค ๊ฒ์ ์์ถํด์ ํต์ฌ๋ง ์ถ์ถํ ์ํ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋งํ๋๋ฐ, ์ถ์ํ์ ๊ด์ ์์ ๊ณ ์ฐจ ํจ์๊ฐ ๊ฐ๋ ์ด์ ์ด ์๋ค.
- ์ถ์ํ ⇒ ์์ฐ์ฑ์ ํฅ์
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ค์ํ ํ๋ก๊ทธ๋จ์ ๋น๊ต์ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ฐ, ์ด์ฒ๋ผ ๋ฌธ์ ํด๊ฒฐ์ด ๋ ์ฌ์์ง๋ ๊ฒ์ด ์ถ์ํ์ ์ด์ ์ด๋ค.
- ๋ฐ๋ณต๋๋ ๋ก์ง์ ๋ณ๋์ ํจ์๋ก ์์ฑํ๋ ๊ฒ์ด ์ถ์ํ์ ์ข์ ์ฌ๋ก์ด๋ค.
- ๊ณ ์ฐจ ํจ์๋ ํจ์๋ฅผ ์ ๋ฌ ๋ฐ๊ฑฐ๋ ๋ฆฌํดํ๊ณ , ํจ์์ ๋ํ ๋ก์ง์ ๊ฐ์ถฐ์ ธ ์๊ธฐ ๋๋ฌธ์ ์ถ์ํ์ ์์ค์ด ๋์์ง๋ ๋งํผ ์์ฐ์ฑ๋ ๋์์ง๊ฒ ๋๋ค.
๐ Reference
https://developer.mozilla.org/ko/
https://inpa.tistory.com/entry/JS-๐-๋ฐฐ์ด-๊ณ ์ฐจํจ์-์ด์ ๋ฆฌ-๐ฏ-mapfilterfindreducesortsomeevery
https://jess2.xyz/JavaScript/higher-order-function/
https://velog.io/@thyoondev/๊ณ ์ฐจ-ํจ์higher-order-function์-๋ํ์ฌ