[JS] ๊ณ ์ฐจํจ์
Categories: javascript
Tags: js, ๊ฐ๋ ์ ๋ฆฌ
๐ ๊ฐ์ธ์ ์ธ ๊ณต๊ฐ์ผ๋ก ๊ณต๋ถ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ณต์ตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ธ๋ก๊ทธ์
๋๋ค.
์ ํํ์ง ์์ ์ ๋ณด๊ฐ ์์ ์ ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋๋ค :๐ธ
[ํ๋ฆฐ ๋ด์ฉ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๋ณต๋ฐ์ผ์ค๊ฑฐ์์]
๐ ์ค๋ ๋ฐฐ์ด ์ด๋ก ์์ฝ
- Javascript์์๋ ํน๋ณํ ๋์ฐ๋ฅผ ๋ฐ๋ ์ผ๊ธ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉฐ ๊ทธ ์ค ํ๋๋ ํจ์. ์ด์ ๋ ์๋์ ๊ฐ๋ค
- ํจ์๋ฅผ ๋ณ์์ ํ ๋นํ ์ ์๊ณ ํจ์๋ฅผ ๋ฐฐ์ด์ ์์๋ ๊ฐ์ฒด์ ์์ฑ ๊ฐ์ผ๋ก ์ ์ฅ ๊ฐ๋ฅ
- ํจ์๋ฅผ ๋ฐ์ดํฐ์ฒ๋ผ ๋ค๋ฃฐ ์ ์์
- ๊ณ ์ฐจํจ์ : ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ์ ์ ์๊ณ , ํจ์๋ฅผ ๋ฆฌํดํ ์ ์๋ ํจ์์ด๋ค.
- ์ฝ๋ฐฑํจ์ : ๋ค๋ฅธํจ์์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋๋ ํจ์
- JavaScript์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋ ๊ณ ์ฐจ ํจ์
- Array.filter()
- Array.Map()
- Array.reduce()
๊ณ ์ฐจํจ์๋?
- ๊ณ ์ฐจ ํจ์(higher order function)
- ํจ์๋ฅผ ์ ๋ฌ์ธ์(argument)๋ก ๋ฐ์ ์ ์๊ณ ,
- ํจ์๋ฅผ ๋ฆฌํดํ ์ ์๋ ํจ์ (=ํด๋ก์ )
- ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌ๋ฐ์ ๊ณ ์ฐจ ํจ์(caller)๋, ํจ์ ๋ด๋ถ์์ ์ด ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถ(invoke)ํ ์ ์๊ณ , ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฝ๋ฐฑ ํจ์์ ์คํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์๋ ์์
- ์์ ํธ์ถํ์ง ์์ ์๋ ์๊ณ , ์ฌ๋ฌ ๋ฒ ์คํํ ์๋ ์์
- ํน์ ์์ ์ ์๋ฃ ํ์ ํธ์ถํ๋ ๊ฒฝ์ฐ๋ ์ดํ์ ์ถฉ๋ถํ ์ ํ ์ ์์.
- ์ฝ๋ฐฑํจ์ (callback function)
- ๋ค๋ฅธ ํจ์(caller)์ ์ ๋ฌ์ธ์(argument)๋ก ์ ๋ฌ๋๋ ํจ์
- ์ด๋ค ์์ ์ด ์๋ฃ๋์์ ๋ ํธ์ถํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์, ๋ต์ ์ ํ๋ฅผ ๋ปํ๋ ์ฝ๋ฐฑ ํจ์๋ผ๋ ์ด๋ฆ์ด ๋ถ์ฌ์ง
- ์ปค๋งํจ์
- โํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์โ๋ฅผ ๊ณ ์ํด ๋ธ ๋ ผ๋ฆฌํ์ ํ์ค์ผ ์ปค๋ฆฌ(Haskell Curry)์ ์ด๋ฆ์ ๋ฐ์ ์ง์
- ๋ฐ๋ก ์ปค๋ง ํจ์๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋, ๊ณ ์ฐจ ํจ์๋ผ๋ ์ฉ์ด๋ฅผ โํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ๋ ํจ์โ์๋ง ํ์ ํด ์ฌ์ฉ
- ์ ํํ๊ฒ ๊ตฌ๋ถํ์๋ฉด, ๊ณ ์ฐจ ํจ์๊ฐ ์ปค๋ง ํจ์๋ฅผ ํฌํจํ๊ณ ์์
- ๊ณ ์ฐจํจ์ ์์
-
์์ 1_ ๋ค๋ฅธ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ๊ฒฝ์ฐ
1 2 3 4 5 6 7
function double(num) { return num * 2; } function doubleNum(func, num) { return func(num); }
- doubleNum : ๋ค๋ฅธ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ๊ณ ์ฐจํจ์
- doubleNum์ ๋งค๊ฐ์ธ์์ธ func๋ doubleNum์ ์ฝ๋ฐฑํจ์์ ํด๋น
- let result = doubleNum(double,6) ์ ๊ฒฝ์ฐ double์ด ํจ์ doubleNum์ ์ฝ๋ฐฑํจ์๊ฐ ๋จ.
- iii์ ๊ฒฐ๊ณผ๋ ์ฝ์์ ์ ๋ ฅ์ console.log(result); โ 12๊ฐ ์ถ๋ ฅ๋๋ค.
-
ํจ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ
1 2 3 4 5
function adder(added) { return function (num) { return num + added; }; }
- adder๋ ๊ณ ์ฐจ ํจ์, ์ธ์ ํ๊ฐ๋ฅผ ์ ๋ ฅ ๋ฐ์ ํจ์(์ต๋ช ํจ์)๋ฅผ return ํจ
- ์ต๋ช ํจ์๋ ์ธ์ ํ ๊ฐ๋ฅผ ๋ฐ์์ added์ ๋ํ ๊ฐ์ ๋ฆฌํด ํจ.
- let result=adder(5)(3); ์ adder์ ๋งค๊ฐ์ธ์๋ก 5, ์ต๋ช ํจ์์ ๋งค๊ฐ์ธ์๋ก num=3์ด ๋ค์ด๊ฐ ๊ฒฐ๊ณผ๋ 8์ด ๋๋ค.
-
adder๊ฐ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ณ์์ ์ ์ฅ๋ ๊ฐ๋ฅ โ js์์ ํจ์๊ฐ ์ผ๊ธ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ
1 2 3
const adderResult = adder(4); const result = adderResult(3); console.log(result); //->7์ด ์ถ๋ ฅ๋จ.
-
ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ณ , ํจ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ
1 2 3 4 5 6 7 8 9 10
function double(num) { return num * 2; } function doubleAdder(added, func) { const doubled = func(added); return function (num) { return num + doubled; }; }
- doubleAdder : ๊ณ ์ฐจํจ์, doubleAdder์ ๋งค๊ฐ์ธ์ func๋ doubleAdder์ ์ฝ๋ฐฑํจ์
- doubleAdder(5, double)(3); ์ ๊ฒฝ์ฐ doubleํจ์๋ doubleAdder์ ์ฝ๋ฐฑํจ์
-
๋ด์ฅ ๊ณ ์ฐจํจ์
๋ด์ฅ ๊ณ ์ฐจํจ์๋?
- JavaScript์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋ ๊ณ ์ฐจ ํจ์ ์์ =๊ทธ ์ค์์ ๋ฐฐ์ด ๋ฉ์๋๋ค ์ค ์ผ๋ถ๊ฐ ๋ํ์ ์ธ ๊ณ ์ฐจ ํจ์์ ํด๋น
filter
- ๋ฐฐ์ด์ filter ๋ฉ์๋
- ๋ชจ๋ ๋ฐฐ์ด์ ์์ ์ค์์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ฅผ ๊ฑธ๋ฌ๋ด๋ ๋ฉ์๋
- ๊ฑธ๋ฌ๋ด๊ธฐ ์ํ ์กฐ๊ฑด์ ๋ช ์ํ ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ๊ธฐ ๋๋ฌธ์ ๊ณ ์ฐจ ํจ์์ ํด๋น
-
๋์ ๋ฐฉ์
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Array.prototype.filter = function(func) { const arr = this; const newArr = [] for(let i = 0; i < arr.length; i++) { //filter์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋ ์ฝ๋ฐฑ ํจ์๋ arr์ ๊ฐ ์์๋ฅผ ์ ๋ฌ๋ฐ์ ํธ์ถ // ์ฝ๋ฐฑ ํจ์๊ฐ true๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ์๋ง ์๋ก์ด ๋ฐฐ์ด์ ์ถ๊ฐ if (func(arr[i]) === true) { newArr.push(this[i]) } } return newArr; //์ฝ๋ฐฑ ํจ์์ ๊ฒฐ๊ณผ๊ฐ true์ธ ์์๋ค๋ง ์ ์ฅ๋ ๋ฐฐ์ด์ ๋ฆฌํด }
- ์ฌ์ฉ์์
-
์์ 1
1 2 3 4 5 6 7
let arr = [1, 2, 3, 4]; function isEven(num) { return num % 2 === 0; } arr.filter(arr, isEven);
- ๋ฐฐ์ด์ ์์ ์ค ์ง์๋ง filter๋์ด ๊ฒฐ๊ณผ๋ [2,4]
-
์์ 2
1 2 3 4 5 6 7
const isLteFive = function (str) { // Lte = less then equal return str.length <= 5; }; arr = ['hello', 'code', 'javaspring', 'happy', 'hacking']; let output = arr.filter(isLteFive);
- โ๊ธธ์ด 5 ์ดํโ๋ฅผ ํ๋ณํ๋ ํจ์๊ฐ ์กฐ๊ฑด์ผ๋ก์ filter ๋ฉ์๋์ ์ ๋ฌ์ธ์๋ก
- ๊ฒฐ๊ณผ : output = [โhelloโ, โcodeโ, โhappyโ]
-
- ๋ฌธ์ -1
-
๋งํ์ฑ ์๊ฐ 27๊ถ์ ์ ๋ณด๊ฐ ๋ฐฐ์ด(Cartoons)์ ๋ด๊ฒจ์์ต๋๋ค. ์ถํ ์ฐ๋๊ฐ 2003๋ ์ธ ๋จํ๋ณธ๋ง ๋ด์ ๋ฐฐ์ด์ ๋ง๋์ธ์.
1 2 3 4 5 6 7 8 9 10 11 12
const cartoons = [ { id: 1, bookType: 'cartoon', title: '์๊ฐ', subtitle: '์ด๋จธ๋์ ์', createdAt: '2003-09-09', genre: '์๋ฆฌ', artist: 'ํ์๋ง', averageScore: 9.66, }, {...},...,{...}];
-
๋ด๊ฐ ํผ ํ์ด
1 2 3 4 5 6 7 8 9 10
const eqaulYear=function(cartoon,year){ let resultArr=[]; for(let i =0 ;i<cartoon.length; i++){ if(cartoon[i].createdAt.slice(0,4)===year){ resultArr.push(cartoon[i]); } } return resultArr; } console.log(eqaulYear(cartoons,'2003'));
- ์์ง filter๊ฐ ์ต์ํ์ง ์์ for๋ฌธ์ผ๋ก ํ์์ ์ฌ์ค, ๊ณ ์ฐจํจ์๋ฅผ ์จ๋ณธ ์ ์ด ์๊ณ ๋ฌธ์ ๋ณด์๋ง์ for๋ฌธ๋ง ์๊ฐ๋ฌ์
- ๊ฒฐ๊ณผ๋ ๋ง๊ฒ ๋์ด
- filter๋ ์ด๋ฏธ ๊ตฌํ๋ ํจ์! ํํฐ ๋งค๊ฐ์ธ์๋ก ํจ์๊ฐ ๋ค์ด์์ผ ํ๊ณ , filter๋ด์ ํจ์๊ฐ true์ธ ์์๋ค๋ง ๋ด์์ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค๋ ๊ฒ ๊ธฐ์ตํ๊ธฐ!
- slice ๋ฉ์๋๋ก ๊ตฌํํ๋๋ฐ ์๋ referece ๋ณด๋ฉด js์์๋ ๋ด์ฅ๊ฐ์ฒด์ธ Date()๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ์ฝ๊ฒ ์ฐ๋๋ฅผ ๋ฐ๋ก ๊ตฌํ ์ ์์
- ์๋ ๋งํฌ ์ฐธ์กฐ (https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Date/getFullYear)
-
reference
1 2 3 4 5 6 7
const isCreatedAt2003 = function(cartoon,year){ const createdYear = new Date(cartoon.createdAt).getFullYear(); return createdYear===year; }; const resultArr = cartoons.filter(iscreatedAt2003,2003); console.log(resultArr);
- Date๊ฐ์ฒด๋ฅผ ํตํด ์์ฑ์๋ฅผ ๋ง๋ค์ด ๋ฉ์๋๋ฅผ ๋ถ๋ฌ์ด
- ๋ฐฐ์ด๊ณผ, ์ฐ๋๋ฅผ ๋งค๊ฐ์ธ์๋ก ํ๋ isCreatedAt2003 ํจ์๋ฅผ ๋ง๋ค์ด filter์ ๋งค๊ฐ์ธ์๋ก ์ฌ์ฉํ์์.
- ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค.
-
map
- map ํ์ฉ์์๋ ๋ฐฐ์ด์ ๊ฐ ์์๊ฐ ํน์ ๋ ผ๋ฆฌ์ ์ํด ๋ค๋ฅธ์์๋ก ์ง์ ๋๋ ๊ฒ์ ๊ธฐ์ตํ๊ธฐ
- ๋ฌธ์ -2
- ๋งํ์ฑ ์๊ฐ 27๊ถ์ ์ ๋ณด๊ฐ ๋ฐฐ์ด์ ๋ด๊ฒจ์์ต๋๋ค. ๊ฐ ์ฑ ์ ๋ถ์ (subtitle)๋ง ๋ด์ ๋ฐฐ์ด์ ๋ง๋์ธ์.
- ์๋ ์ฝ๋
- ๋ฐฐ์ด์ ๊ฐ ์์ : ๊ฐ ์๊ฐ 1- 27๊ถ์ ์ ๋ณด
- ํน์ ๋ ผ๋ฆฌ(ํจ์) : ์ฑ ํ ๊ถ์ ๋ถ์ ๋ฅผ ์ฐพ์ต๋๋ค.
- ๋ค๋ฅธ ์์๋ก ์ง์ : ๊ฐ ์๊ฐ 1- 27๊ถ์ ๋ถ์
-
๋์ ํ์ด
1 2 3 4 5
const findSubtitle=function(cartoon){ return cartoon.subtitle; } const subtitles=cartoons.map(findSubtitle); console.log(subtitles);
-
์ถ๋ ฅ ๊ฒฐ๊ณผ
- ์ค๋ฅ ๋ฐ์
-
์ค๋ฅ๋ผ๊ธฐ๋ณด๋ค๋ ์ถ๋ ฅ์ด ๊ณ์ ์๋จ, ํ๋ฆฐ ํ์ด
1 2 3 4 5 6
const findSubtitle=function(cartoon){ return cartoon.subtitle; } const subtitles= map(findSubtitle,cartoons); console.log(subtitles);
-
๋ฐฐ์ด์ ๋ด์ฅ ๊ณ ์ฐจํจ์์ด๋ฏ๋ก ๋ฐฐ์ด.map(func)๋ก ํ ๋นํด์ผ ํจ.
-
reduce
reduce๋ ์ค์ํ๊ธฐ๋ํ๊ณ ๋ค๋ฅธ ํจ์์ ๋นํด ์ ์ดํด๊ฐ ์๊ฐ๊ณ ๋ฐ๋ก ์ ๋ฆฌ๋ ๊ฒ ์๋ฃ๋ ์์ด์ MDN๋ณด๊ณ ์ดํดํจ,,
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#try_it
Array.prototype.reduce(callbackFn)
- ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ฅผ ์์ฐจ์ ์ผ๋ก ์ํํ์ฌ ํ๋์ ๊ฐ์ผ๋ก ์ค์ฌ return
- reduce(callbackFn) ๋๋ reduce(callbackFn. initValue) ํํ๋ก ์ฌ์ฉํ ์ ์๊ณ
- callbackFn์ 4๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ (accumulator , currentValue , currentIdx, array)
- accumulator : callbackํจ์์ ๋ฐํ๊ฐ์ ๋์
- currentValue : ๋ฐฐ์ด์ ํ์ฌ ๊ฐ
- currentIdx (Optional) : ๋ฒ ์ด์ ํ์ฌ ๊ฐ์ ์ธ๋ฑ
- array (Optional) : ํธ์ถํ ๋ฐฐ์ด
- initValue(Optional)๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ ์ฝ๋ฐฑ์ด ์ฒ์ ํธ์ถ๋ ๋ ์ด๊ธฐํ ๋๋ ๊ฐ์ด๋ฉฐ (initValue=acummulator, currentValue๋ ์ฒซ ๋ฒ์งธ ๊ฐ)
- initValue ์์ด ๋งค๊ฐ์ธ์๊ฐ ์ฝ๋ฐฑํจ์ 1๊ฐ๋ง ์ฌ ๊ฒฝ์ฐ์๋ย accumulator๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๊ณ ย callbackFn๋ฐฐ์ด์ ๋ ๋ฒ์งธ ๊ฐ(currentValue)์ผ๋ก ์คํ
-
์์
1 2 3 4 5 6 7 8 9 10 11 12
const array = [15, 16, 17, 18, 19]; function reducer(accumulator, currentValue, index) { const returns = accumulator + currentValue; console.log( `accumulator: ${accumulator}, currentValue: ${currentValue},index: ${index}, returns: ${returns}`, ); return returns; } array.reduce(reducer);
-
๊ฒฐ๊ณผ
๐ accumulator currentValue index ๋ฐํ ๊ฐ First call 15 16 1 31 Second call 31 17 2 48 Third call 48 18 3 66 Fourth call 66 19 4 85 - array๋ ํ๋ก์ธ์ค๋ฅผ ํตํด ์ ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค
- ๋ฐํ๋๋ ๊ฐ์ย
reduce()
๋ง์ง๋ง ์ฝ๋ฐฑ ( )์ ๊ฐ์ ๋๋คย :85
.
-
- reduce ํ์ฉ์์๋ ๋ฐฐ์ด์ ๊ฐ ์์๊ฐ ํน์ ๋ฐฉ๋ฒ(ํจ์)์ ๋ฐ๋ผ ์ํ๋ ํ๋์ ํํ๋ก ์์ถํ๋ ๊ฒ ์ดํดํ๊ธฐ.
- ๋ฌธ์ -3
- ๋งํ์ฑ ์๊ฐ 27๊ถ์ ์ ๋ณด๊ฐ ๋ฐฐ์ด์ ๋ด๊ฒจ์์ต๋๋ค. ๊ฐ ๋จํ๋ณธ์ ํ์ ์ ํ๊ท ์ ๋ฆฌํดํ์ธ์.
- ์๋์ฝ๋
- ๋ฐฐ์ด์ ๊ฐ ์์ : ๊ฐ ์๊ฐ 1- 27๊ถ์ ์ ๋ณด
- ์์ถํ๋ ๋ฐฉ๋ฒ (ํจ์) : ๊ฐ ๋จํ๋ณธ์ ํ์ ์ ๋์ ๊ฐ์ ๋ํฉ๋๋ค.
- ์ํ๋ ํํ : ์ซ์๋ก ๋์ ํฉ๋๋ค.
- ์์ถ๋ ๊ฒฐ๊ณผ : ๊ฐ ๋จํ๋ณธ์ ํ์ ์ ํฉ์ ๋จํ๋ณธ์ ๊ธธ์ด๋ก ๋๋ ํ์ ์ ํ๊ท
-
๋์ ํ์ด
1 2 3 4 5
const reviewAvg = function(sum, cartoon){ return sum+cartoon.averageScore; } let initValue=0; const reviewScore =cartoons.reduce(reviewAvg,initValue)/cartoons.length;
-
์ถ๊ฐ ๋์ - max ๊ฐ ๊ตฌํ๊ธฐ
1 2
const cartoonMaxScore =cartoons.reduce( (sum,cartoon)=> sum<cartoon.averageScore? cartoon.averageScore :sum,cartoons[0].averageScore);
๊ณ ์ฐจํจ์์ ํ์์ฑ
๋ณต์กํ ์ด๋ค ๊ฒ์ ์์ถํด์ ํต์ฌ๋ง ์ถ์ถํ ์ํ๋ก ๋ง๋๋ ๊ฒ์ด ์ถ์ํ
JavaScript๋ฅผ ๋น๋กฏํ ๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ญ์, ์ถ์ํ์ ๊ฒฐ๊ณผ
- ์ถ์ํ = ์์ฐ์ฑ(productivity)์ ํฅ์
ํจ์๋ฅผ ํตํด ์ป์ ์ถ์ํ๋ฅผ, ํ ๋จ๊ณ ๋ ๋์ธ ๊ฒ์ด ๊ณ ์ฐจ ํจ์
- ํจ์ = ๊ฐ์ ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋ฆฌํดํ๋ค. = ๊ฐ์ ๋ํ ๋ณต์กํ ๋ก์ง์ ๊ฐ์ถ์ด์ ธ ์๋ค. = ๊ฐ ์์ค์์์ ์ถ์ํ
- ๊ณ ์ฐจ ํจ์๋ ์ด ์ถ์ํ์ ์์ค์ ์ฌ๊ณ ์ ์ถ์ํ ์์ค์ผ๋ก ๋์ด์ฌ๋ฆผ
- ๊ฐ ์์ค์ ์ถ์ํ: ๋จ์ํ ๊ฐ(value)์ ์ ๋ฌ๋ฐ์ ์ฒ๋ฆฌํ๋ ์์ค
- ์ฌ๊ณ ์ ์ถ์ํ: ํจ์(์ฌ๊ณ ์ ๋ฌถ์)๋ฅผ ์ ๋ฌ๋ฐ์ ์ฒ๋ฆฌํ๋ ์์ค
๋ค์ ๋งํด ๊ณ ์ฐจ ํจ์๋ฅผ ํตํด, ๋ณด๋ค ๋์ ์์ค(higher order)์์ ์๊ฐํ ์ ์์
- ๊ณ ์ฐจ ํจ์ = ํจ์๋ฅผ ์ ๋ฌ๋ฐ๊ฑฐ๋ ํจ์๋ฅผ ๋ฆฌํดํ๋ค. = ์ฌ๊ณ (ํจ์)์ ๋ํ ๋ณต์กํ ๋ก์ง์ ๊ฐ์ถ์ด์ ธ ์๋ค. = ์ฌ๊ณ ์์ค์์์ ์ถ์ํ
๊ณ ์ฐจํจ์ ๊ตฌํํด๋ณด๊ธฐ
Underscore.js๋ย ๋ด์ฅ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ map, filter, revoke ๋ฑ๊ณผ ๊ฐ์ด
ํ๋ก๊ทธ๋๋ฐ์ ํฐ ๋์์ด ๋๋ ๋ง์ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ํจ.
์๋ ๋งํฌ๋ก ์ด๋
[https://www.geeksforgeeks.org/underscore-js-_-each-function/?ref=lbp]
_.slice ๋, _.take, _.drop, _.last๊น์ง๋ ์ฌ์ ๋๋ฐ callbackํจ์ ๊ตฌํ์ ์ฝ์ง ์์๋ค ์จ๋ณธ์ ์๊ธฐ๋ ํ๊ณ
์ด์ ๋ฐฐ์์ ๊ตฌํํ๊ธฐ์ ์๊ฐ์ด ์กฐ๊ธ ๋ ์๋ชจ๋์๋๋ฐ ๊ทธ๋๋ ์ด๋ป๊ฒ๋ ๊ตฌํํด๋ณด๋ ค๊ณ ๋ ธ๋ ฅํจ.
_.each
-
each์ map์ ๊ณ ์ฐจํจ์ ์ค์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ํจ์,
-
map๊ณผ ๋น์ทํ์ง๋ง each๋ ๋ฐํ์ ํ์ง ์๊ณ map์ ๋ฐํ์ ํ๋ค๋ ์ฐจ์ด๊ฐ ์์.
1 2 3 4 5
arr=[1,2,3,4,5] for(let i =0; i<arr.lenth;i++){ arr[i]=func(arr[i]); //=== map func(arr[i]) //=== each }
-
===forEach()
-
-
_.each() ๊ตฌํ
-
_.each๋ collection์ ๊ฐ ๋ฐ์ดํฐ์ ๋ฐ๋ณต์ ์ธ ์์ ์ ์ํํฉ๋๋ค.
-
collection(๋ฐฐ์ด ํน์ ๊ฐ์ฒด)๊ณผ ํจ์ iteratee(๋ฐ๋ณต๋๋ ์์ )๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ (iteratee๋ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋๋ ํจ์์ด๋ฏ๋ก callback ํจ์
-
collection์ ๋ฐ์ดํฐ(element ๋๋ property)๋ฅผ ์ํํ๋ฉด์ iteratee์ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ์ ๋ฌํ์ฌ ์คํํฉ๋๋ค
-
๋ค์ํ ํํ์ callback ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํจ.
-
iteratee ์ค๋ช
1 2 3 4 5
iteratee๋ ์ฐจ๋ก๋๋ก ๋ฐ์ดํฐ(element ๋๋ value), ์ ๊ทผ์(index ๋๋ key), collection์ ๋ค๋ฃฐ ์ ์์ด์ผ ํฉ๋๋ค. * ๋ฐฐ์ด arr์ ์ ๋ ฅ๋ฐ์ ๊ฒฝ์ฐ, iteratee(ele, idx, arr) * ๊ฐ์ฒด obj๋ฅผ ์ ๋ ฅ๋ฐ์ ๊ฒฝ์ฐ, iteratee(val, key, obj) * ์ด์ฒ๋ผ collection์ ๋ชจ๋ ์ ๋ณด๊ฐ iteratee์ ์ธ์๋ก ์ ์ ๋ฌ๋์ด์ผ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃฐ ์ ์์ต๋๋ค. * ์ค์ ๋ก ์ ๋ฌ๋๋ callback ํจ์๋ collection์ ๋ชจ๋ ์ ๋ณด๊ฐ ํ์ํ์ง ์์ ์๋ ์์ต๋๋ค.
-
๋ด๊ฐ ๊ตฌํํ ์ฝ๋
1 2 3 4 5 6 7 8 9 10 11
_.each = function (collection, iteratee) { if(Array.isArray(collection)){ for (let i = 0; i < collection.length; i++) { iteratee(collection[i], i, collection); } }else if(typeof collection ==='object'){ for(let key in collection){ iteratee(collection[key],key,collection); } } };
- _.each = function (collection, iteratee) { } ์ด๋ ๊ฒ ๋์ด์๊ณ ์ค๊ดํธ ๋ด๋ฅผ ๊ตฌํํด์ผ ํ๋๋ฐ iteratee์ ๋ํ ์ค๋ช ์ ์ฝ์ด๋ ์ด๊ฒ ๋ญ๊ฐ ํ๋๋ฐ ์๊ณ ๋ณด๋ callbackํจ์์ ํด๋นํ๋ ํจ์์์
- ๊ทธ ํ์๋ ๋ฐฐ์ด์ธ์ง ๊ฐ์ฒด์ธ์ง ๊ตฌ๋ถํ๋ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ์
- ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ typeof ์ฌ์ฉํ๋ฉด ๋๋ค object๋ก ๋์ค๊ธฐ ๋๋ฌธ์
- ๋ฐฐ์ด์ธ์ง ๋จผ์ ๊ฑฐ๋ฅธ ํ ๋ฐฐ์ด์ด ์๋๊ณ typeof๊ฐ object์ด๋ฉด ๊ฐ์ฒด๋ก ๋ถ๋ฆฌ.
- ์ํ ํ ํ ์ฝ๋ฐฑ ํจ์์ ๊ฐ์ฒด(๋ฐฐ์ด)์ ์์์ key(index) ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ์ธ์๋ก ๋ฃ์ด์ค.
-
_.filter
-
_.filter() ๊ตฌํ
-
_.filter๋ test ํจ์๋ฅผ ํต๊ณผํ๋ ๋ชจ๋ ์์๋ฅผ ๋ด์ ์๋ก์ด ๋ฐฐ์ด์ ๋ฆฌํดํฉ๋๋ค.
-
test(element)์ ๊ฒฐ๊ณผ(return ๊ฐ)๊ฐ truthy์ผ ๊ฒฝ์ฐ, ํต๊ณผ test ํจ์๋ ๊ฐ ์์์ ๋ฐ๋ณต ์ ์ฉ๋ฉ๋๋ค.
-
์์ ๋ง๋ _.each ํ์ฉํ๊ธฐ
-
_.filter = function (arr, test) { } , 2๋ฒ์งธ ์ธ์๋ ์ฝ๋ฐฑํจ์์ ํด๋น.
-
๋ด๊ฐ ๊ตฌํ ์ฝ๋
1 2 3 4 5 6 7 8 9 10 11
_.filter = function (arr, test) { let result = []; _.each(arr, function(element) { if (test(element)) { result.push(element); } }); return result; };
-
_.each ๊ตฌํ๋ ์ด๋ ค์ ๋๋ฐ ์ด๋ป๊ฒ ํ์ฉํด์ผํ๋ ๋ณด๋ค๊ฐ ์์ _.indexOf ๋ฅผ _.each๋ก ํ์ฉํ ์์ ๊ฐ ์์ด์ ๋ณด๊ณ ๋น์ทํ๊ฒ ํด๋ด.
-
_.filter๋ก ๋งค๊ฐ์ธ์(test)๋ก ์ฝ๋ฐฑํจ์๊ฐ ๋ค์ด์ค๋๋ฐ ์ด ํจ์์ ๊ฒฐ๊ณผ๊ฐ true์ด๋ฉด ํด๋น ์์๋ฅผ ์๋ก์ด ๋ฐฐ์ด์ ์ถ๊ฐํ์ฌ ๋ฆฌํด ํ๋ ๋ฐฉ์.
-
_.each๋ก ๊ตฌํํ๊ธฐ ์ด๋ ค์ฐ๋ฉด for๋ฌธ์ผ๋ก ๊ตฌํํด๋ณด๊ณ ๋ฆฌํฉํ ๋ง ํด๋ณด๊ธฐ
1 2 3 4 5 6 7 8 9 10 11 12
_.filter = function (arr, test) { let result = []; for(let i =0; i<arr.length ; i++){ arr[i] = element; if(test(element)){ result.push(element); } } return result; }
- ์ด๋ ๊ฒ ๊ตฌํํ ๋ค์ _.each๋ก ๋ณ๊ฒฝํด๋ณด๋ฉด ๊ณ ์ฐจํจ์์ ๋ํด ๋ ์ดํดํ๊ธฐ ์ฌ์.
- _.each๋ ๊ฐ์ฒด์ ๊ฐ ์์๋ฅผ ๊บผ๋ด์ ์ฝ๋ฐฑํจ์์ ๋ฃ์ด์ฃผ๋๊น
- for๋ฌธ์ผ๋ก ๋ถํฐ 2์ค์ _.each๋ก ๋์ฒดํ ์ ์์.
-
-
_.reject ๊ตฌํ๋ ์ค์ต์ ์์๋๋ฐ filter์ ์ ๋ฐ๋๋ก test ํจ์๋ฅผ ํต๊ณผํ์ง ์๋ ์์๋ฅผ ๋ด๋ ๊ฒ์ธ๋ฐ if์ ๋ง ๋ถ์ ์ฐ์ฐ์ ์ฌ์ฉํ๋ฉด ๋จ.
-
_.uniq
-
_.uniq๋ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์์๊ฐ ์ค๋ณต๋์ง ์๋๋ก ์๋ก์ด ๋ฐฐ์ด์ ๋ฆฌํดํจ.
-
_.each, _.indexOf ํ์ฉํ๊ธฐ
-
์ค๋ณต์ฌ๋ถ๋ ์๊ฒฉํ ๋์น์ฐ์ฐ.
-
๋ฐฐ์ด์ ์์๋ ๋ชจ๋ primitive value
-
๋ด๊ฐ ๊ตฌํํ ์ฝ๋
1 2 3 4 5 6 7 8 9 10 11
_.uniq = function (arr) { let result=[]; _.each(arr, function(element){ if(_.indexOf(result,element)===-1){ result.push(element); } }); return result; }
- ๊ณ์ ํ ์คํธ ํต๊ณผ๊ฐ ์๋์ ์ ์๋๋์ง ์ด ์ฝ๋๊ฐ ๋ง๋๊ฒ ๊ฐ์๋ฐ ์ด์ํ๋ค.
- ์ค๊ดํธ ์๋ชป ์ ์๋์ง ํ์ฐธ ๊ณ ๋ฏผํ๋ค๊ฐ ๋ค๋ฅธ ๊ฒ ํ๊ณ ๋ค์ ๋ด๋ ๋ชฐ๋๋๋ฐ ํ์ฐธ ๋ณด๋ค๊ฐ _.indexOf์ . dot์ด ์์์โฆ!
-
_.map()
-
react์์๋ map๋ง ์ฌ์ฉํด์ map์ ์ดํดํ๋ ๊ฒ ์ค์
-
_.map ๊ตฌํ
-
๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ๋ค๋ฅธ ๊ฒ(iteratee์ ๊ฒฐ๊ณผ)์ผ๋ก ๋งคํ(mapping)
-
iteratee(๋ฐ๋ณต๋๋ ์์ )๋ฅผ ๋ฐฐ์ด์ ๊ฐ ์์์ ์ ์ฉ(apply)ํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ์๋ก์ด ๋ฐฐ์ด์ ๋ฆฌํด
-
๋ด๊ฐ ๊ตฌํํ ์ฝ๋
1 2 3 4 5 6 7
_.map = function (arr, iteratee) { let result =[]; _.each(arr,function(element){ result.push(iteratee(element) }); return result; }
-
_.pluck()
-
๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ ์์๋ก ๊ฐ๋ ๋ฐฐ์ด๊ณผ ๊ฐ ์์์์ ์ฐพ๊ณ ์ ํ๋ key ๋๋ index๋ฅผ ์ ๋ ฅ๋ฐ์
-
๊ฐ ์์์ ํด๋น ๊ฐ ๋๋ ์์๋ง์ ์ถ์ถํ์ฌ ์๋ก์ด ๋ฐฐ์ด์ ์ ์ฅํ๊ณ ,
-
์ต์ข ์ ์ผ๋ก ์๋ก์ด ๋ฐฐ์ด์ ๋ฆฌํด
-
์๋ฅผ ๋ค์ด, ๊ฐ ๊ฐ์ธ์ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด๋ฅผ ์์๋ก ๊ฐ๋ ๋ฐฐ์ด์ ํตํด์, ๋ชจ๋ ๊ฐ์ธ์ ๋์ด๋ง์ผ๋ก ๊ตฌ์ฑ๋ ๋ณ๋์ ๋ฐฐ์ด์ ๋ง๋ค ์ ์์
-
์ต์ข ์ ์ผ๋ก ๋ฆฌํด๋๋ ์๋ก์ด ๋ฐฐ์ด์ ๊ธธ์ด๋ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋๋ ๋ฐฐ์ด์ ๊ธธ์ด์ ๊ฐ์์ผ
-
๋ฐ๋ผ์ ์ฐพ๊ณ ์ ํ๋ key ๋๋ index๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ์์์ ๊ฒฝ์ฐํจ, ์ถ์ถ ๊ฒฐ๊ณผ๋ undefined ์ ๋๋ค.
-
_.each๋ฅผ ํ์ฉํ์ฌ _.pluck ๊ตฌํ ์์
1 2 3 4 5 6 7 8
//_.pluck์ _.each๋ฅผ ์ฌ์ฉํด ๊ตฌํํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค. _.pluck = function (arr, keyOrIdx) { let result = []; _.each(arr, function (item) { result.push(item[keyOrIdx]); }); return result; }
-
-.map์ผ๋ก ๊ตฌํ ํด๋ณด๊ธฐ.
1 2 3 4 5 6 7 8 9 10
_.pluck = function (arr, keyOrIdx) { let newArr=[]; if(keyOrIdx===undefined){ return undefined; } _.map(arr,function(item){ newArr.push(item[keyOrIdx]); }); return newArr; };
_.reduce()
-
๋ฐฐ์ด์ ์ํํ๋ฉฐ ๊ฐ ์์์ iteratee ํจ์๋ฅผ ์ ์ฉํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๊ณ์ํด์ ๋์ (accumulate), ์ต์ข ์ ์ผ๋ก ๋์ ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํด
- ๋ฐฐ์ด [1, 2, 3, 4]๋ฅผ ์ ๋ถ ๋ํด์ 10์ด๋ผ๋ ํ๋์ ๊ฐ์ ๋ฆฌํด
- ๊ฐ ์์๊ฐ ์ฒ๋ฆฌ๋ ๋๋ง๋ค ๋์ ๋๋ ๊ฐ์ ์ฐจ๋ก๋๋ก 1, 1+2, 1+2+3, 1+2+3+4
-
๋ค์์ ์ ๋ณด๊ฐ ํ๋์ ๊ฐ์ผ๋ก ์ถ์(์์ถ, ํ์, reduction)๋๊ธฐ ๋๋ฌธ์ reduce๋ผ๋ ์ด๋ฆ์ด ๋ถ๊ฒ ๋ ๊ฒ
-
_.reduce(arr, iteratee, initVal)
- arr : ๋ฐฐ์ด
- iteratee : ๊ฐ ์์์ ๋ฐ๋ณตํ ์์
- initVal : ์ด๊ธฐ ๊ฐ
-
iteratee(acc, ele, idx, arr)
- acc : ์ด์ ์์๊น์ง์ ๋ฐ๋ณต ์์ ์ ๊ฒฐ๊ณผ๋ก ๋์ ๋ ๊ฐ
- ele : ๋ฐ๋ณต ์์ ์ ์ํํ (์์ง ์ํํ์ง ์์) ํ์ฌ์ ์์
- ์ธ ๋ฒ์งธ ์ธ์๋ก ์ด๊ธฐ ๊ฐ์ด ์ ๋ฌ๋๋ ๊ฒฝ์ฐ, ๊ทธ ๊ฐ์ ๋์ ๊ฐ์ ๊ธฐ์ด(acc)๋ก ํ์ฌ ๋ฐฐ์ด์ โ์ฒซ ๋ฒ์งธโ ์์๋ถํฐ ๋ฐ๋ณต ์์ ์ด ์ํ
- ์ด๊ธฐ ๊ฐ์ด ์ ๋ฌ๋์ง ์์ ๊ฒฝ์ฐ, ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋์ ๊ฐ์ ์ถ๋ฐ๋ก ํ์ฌ ๋ฐฐ์ด์ โ๋ ๋ฒ์งธโ ์์๋ถํฐ ๋ฐ๋ณต ์์ ์ด ์ํ
-
์์ ์ฐธ๊ณ
1 2 3 4 5 6 7 8 9 10 11 12
const numbers = [1,2,3]; const sum = _.reduce(numbers, function(total, number){ return total + number; }); // ์ด๊ธฐ ๊ฐ์ด ์ฃผ์ด์ง์ง ์์์ผ๋ฏ๋ก, ์ด๊ธฐ ๊ฐ์ ๋ฐฐ์ด์ ์ฒซ ์์์ธ 1์ ๋๋ค. ๋ ๋ฒ์งธ ์์๋ถํฐ ๋ฐ๋ณต ์์ ์ด ์์๋ฉ๋๋ค. // 1 + 2 = 3; (์ฒซ ์์ ์ ๊ฒฐ๊ณผ๊ฐ ๋์ ๋์ด ๋ค์ ์์ ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.) // 3 + 3 = 6; (๋ง์ง๋ง ์์ ์ด๋ฏ๋ก ์ต์ข ์ ์ผ๋ก 6์ด ๋ฆฌํด๋ฉ๋๋ค.) const identity = _.reduce([3, 5], function(total, number){ return total + number * number; }, 2); // ์ด๊ธฐ ๊ฐ์ด 2๋ก ์ฃผ์ด์ก์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์์๋ถํฐ ๋ฐ๋ณต ์์ ์ด ์์๋ฉ๋๋ค. // 2 + 3 * 3 = 11; (์ฒซ ์์ ์ ๊ฒฐ๊ณผ๊ฐ ๋์ ๋์ด ๋ค์ ์์ ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.) // 11 + 5 * 5 = 36; (๋ง์ง๋ง ์์ ์ด๋ฏ๋ก ์ต์ข ์ ์ผ๋ก 36์ด ๋ฆฌํด๋ฉ๋๋ค.)
-
๋ด๊ฐ ๊ตฌํํ ์ฝ๋
1 2 3 4 5 6 7 8 9 10 11 12 13 14
_.reduce = function (arr, iteratee, initVal) { // TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. let acc=initVal; _.each(arr,function(element,idx,collection){ if(acc===undefined){ acc = arr[0]; }else{ acc =iteratee(acc,element,idx,collection); } }) return acc; };
๋ง์ด ์ด๋ ค์ ์ง๋ง ๊ทธ๋๋ ๋ด์ฅ๊ฐ์ฒด๊ฐ ์ด๋ค์์ผ๋ก ๊ตฌํ๋๋์ง ์ดํดํ ์ ์์๋ ์๊ฐ์ด์๋คโฆ ์์ง ์ฝ๋ฐฑ ํจ์์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํด์ each๋ฌธ ๋ถํฐ๋ ์กฐ๊ธ ๋นํฉํ๋๋ฐ ์ ์ฝ์กฐ๊ฑด์ด ๋ง์ผ๋ฉด ์ผ๋จ ์ ์ฝ์กฐ๊ฑด ๋ฌด์ํ๊ณ ๋ด๊ฐ ํ ์ ์๋ ๊ฒ์ ๊ตฌํํ ๋ค์ ๋ฆฌํฉํ ๋ง์ผ๋ก ์์ ํด๋๊ฐ๋ฉด ๋๋๊น ์ฒ์๋ถํฐ ์ฝ๋๋ฅผ ์ ์งค ์๊ฐ์ ํ์ง๋ง๊ณ ๋ฆฌํฉํ ๋ง ํ ์๊ฐ์ ํด์ผํจ. ๋งค๋ฒ ๊ฐ์ฌ๋์ด ํ์ ๋ง์์ธ๋ฐ ํ ์คํธ๋ฅผ ๋นจ๋ฆฌ ํต๊ณผํด์ผ๋๋ค๋ ์๊ฐ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํ์ง๋ชปํ์. ๊ทธ๋์ ์ ๋ถ for๋ฌธ์ผ๋ก ๊ตฌํํ๊ณ ์ฝ๋ฐฑ์ ์ดํดํ ๋ค์, ๋ค์ ์๋ํด ๋ณผ ์์
Leave a comment