-
[JS] chapter14. ๋ด์ฅ๊ณ ์ฐจํจ์codeStates front-end/Java Script 2023. 1. 12. 13:59๋ฐ์ํ
๐ ๋ด์ฅ ๊ณ ์ฐจ ํจ์
JS์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋ ๊ณ ์ฐจ ํจ์๊ฐ ์๋ค
๋ฐฐ์ด ๋ฉ์๋๋ค ์ค ์ผ๋ถ๊ฐ ๋ํ์ ์ธ ๊ณ ์ฐจ ํจ์
1. filter
๋ฐฐ์ด ๋ฉ์๋์ด๋ฉฐ, ๋ชจ๋ ๋ฐฐ์ด์ ์์ ์ค์์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ฅผ ๊ฑธ๋ฌ๋ด๋ ๋ฉ์๋
filter ๊ณผ์
- ๋ฐฐ์ด์ ๊ฐ ์์๊ฐ
- ํน์ ๋ ผ๋ฆฌ(ํจ์)์ ๋ฐ๋ฅด๋ฉด, ์ฌ์ค(true)์ผ ๋
- ๋ฐ๋ก ๋ถ๋ฅ(filter).
// ์๋ ์ฝ๋์์ '์ง์'์ '๊ธธ์ด 5 ์ดํ'๋ ๋ฌธ๋ฒ ์ค๋ฅ(syntax error)์ ํด๋นํฉ๋๋ค. // ์๋ฏธ๋ง ์ดํดํด๋ ์ถฉ๋ถํฉ๋๋ค. let arr = [1, 2, 3, 4]; let output = arr.filter(์ง์); console.log(output); // ->> [2, 4] arr = ['hello', 'code', 'states', 'happy', 'hacking']; output = arr.filter(๊ธธ์ด 5 ์ดํ) console.log(output); // ->> ['hello', 'code', 'happy']
์ฌ๊ธฐ์ ๊ฑธ๋ฌ๋ด๋ ๊ธฐ์ค์ด ๋๋ ํน์ ์กฐ๊ฑด์ filter ๋ฉ์๋์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ, ์ด๋ ์ ๋ฌ๋๋ ์กฐ๊ฑด์ ํจ์์ ํํ
filter ๋ฉ์๋๋, ๊ฑธ๋ฌ๋ด๊ธฐ ์ํ ์กฐ๊ฑด์ ๋ช ์ํ ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ๊ธฐ ๋๋ฌธ์ ๊ณ ์ฐจ ํจ์์ด๋ค
// ์๋ ์ฝ๋๋ ์ ํํ ํํ ๋ฐฉ์์ ์๋๋๋ค. // ์๋ฏธ๋ง ์ดํดํด๋ ์ถฉ๋ถํฉ๋๋ค. let arr = [1, 2, 3]; // ๋ฐฐ์ด์ filter ๋ฉ์๋๋ ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ๋ ๊ณ ์ฐจ ํจ์์ ๋๋ค. // arr.filter๋ฅผ ์คํํ๋ฉด ๋ด๋ถ์ ์ผ๋ก arr์ ์ ๊ทผํ ์ ์๋ค๊ณ ์๊ฐํด๋ ๋ฉ๋๋ค. arr.filter = function (arr, func) { const newArr = []; for (let i = 0; i < arr.length; i++) { // filter์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋ ์ฝ๋ฐฑ ํจ์๋ arr์ ๊ฐ ์์๋ฅผ ์ ๋ฌ๋ฐ์ ํธ์ถ๋ฉ๋๋ค. // ์ฝ๋ฐฑ ํจ์๊ฐ true๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ์๋ง ์๋ก์ด ๋ฐฐ์ด์ ์ถ๊ฐ๋ฉ๋๋ค. if (func(arr[i]) === true) { newArr.push(this[i]); } } // ์ฝ๋ฐฑ ํจ์์ ๊ฒฐ๊ณผ๊ฐ true์ธ ์์๋ค๋ง ์ ์ฅ๋ ๋ฐฐ์ด์ ๋ฆฌํดํฉ๋๋ค. return newArr; }; /* * filter ๋ฉ์๋์ ๋ณด๋ค ์ ํํ ์ ์๋ ์๋์ ๊ฐ์ต๋๋ค. ์๋ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ๋ค์ ์ ๋์์ ํ๋กํ ํ์ ๊ณผ this์ ๋ํ ํ์ต์ด ํ์ํฉ๋๋ค. * Array.prototype.filter = function(func) { * const arr = this; * const newArr = [] * for(let i = 0; i < arr.length; i++) { * if (func(arr[i]) === true) { * newArr.push(this[i]) * } * } * return newArr; * } */
filter ๋ฉ์๋๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ฝ๋ฐฑ ํจ์์ ๋ค์ ์ ๋ฌ ์ฝ๋ฐฑ ํจ์๋ ์ ๋ฌ๋ฐ์ ๋ฐฐ์ด์ ์์๋ฅผ
๋ฐ์ ํจ์๋ฅผ ์คํํ๊ณ , ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฐธ(true) ๋๋ ๊ฑฐ์ง(false)์ ๋ฆฌํด
// ํจ์ ํํ์ const isEven = function (num) { return num % 2 === 0; }; let arr = [1, 2, 3, 4]; // let output = arr.filter(์ง์); // '์ง์'๋ฅผ ํ๋ณํ๋ ํจ์๊ฐ ์กฐ๊ฑด์ผ๋ก์ filter ๋ฉ์๋์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค. let output = arr.filter(isEven); console.log(output); // ->> [2, 4] const isLteFive = function (str) { // Lte = less then equal return str.length <= 5; }; arr = ['hello', 'code', 'states', 'happy', 'hacking']; // output = arr.filter(๊ธธ์ด 5 ์ดํ) // '๊ธธ์ด 5 ์ดํ'๋ฅผ ํ๋ณํ๋ ํจ์๊ฐ ์กฐ๊ฑด์ผ๋ก์ filter ๋ฉ์๋์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค. let output = arr.filter(isLteFive); console.log(output); // ->> ['hello', 'code', 'happy']
2. map
- ๋ฐฐ์ด์ ๊ฐ ์์๊ฐ
- ํน์ ๋ ผ๋ฆฌ(ํจ์)์ ์ํด
- ๋ค๋ฅธ ์์๋ก ์ง์ (map)
const double = function (num) { return num * 2; }; let arr = [1, 2, 3, 4, 5, 6, 7]; let output = arr.map(double); console.log(output); // [2, 4, 6, 8, 10, 12, 14]
3. reduce
- ๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ
- ํน์ ๋ฐฉ๋ฒ(ํจ์)์ ๋ฐ๋ผ
- ์ํ๋ ํ๋์ ํํ๋ก
- ์์ถ (reduction)
const addAccCur = function (acc, cur) { return acc + cur; }; let arr = [1, 2, 3, 4, 5, 6, 7]; let output = arr.reduce(addAccCur); console.log(output); // 28
์ด๊ธฐ๊ฐ์ ์ ์ธ ํ์ ๋
const addAccCur = function (acc, cur) { return acc + cur; }; const initialValue = 1; let arr = [1, 2, 3, 4, 5, 6, 7]; let output = arr.reduce(addAccCur, initialValue); console.log(output); // 29
๐ฆ ๊ณ ์ฐจํจ์์ ์ค์์ฑ
์ถ์ํ(abstraction)
๋ณต์กํ ์ด๋ค ๊ฒ์ ์์ถํด์ ํต์ฌ๋ง ์ถ์ถํ ์ํ
์ถ์ํ = ์์ฐ์ฑ์ ํฅ์
ํจ์ = ๊ฐ์ ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋ฆฌํด = ๊ฐ์ ๋ํ ๋ณต์กํ ๋ก์ง์ ๊ฐ์ถ์ด์ ธ ์์ = ์ถ์ํ
getAverage ํจ์๋ ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์, ํ๊ท ๊ฐ์ ๋ฆฌํด
function getAverage(data) { let sum = 0; for (let i = 0; i < data.length; i++) { sum = sum + data[i]; } return sum / data.length; } let output = getAverage([1, 2, 3]); console.log(output); // --> 2 output = getAverage([4, 2, 3, 6, 5, 4]); console.log(output); // --> 4
์ฌ๊ณ ์์ค์ ์ถ์ํ
const data = [ { gender: 'male', age: 24, }, { gender: 'male', age: 25, }, { gender: 'female', age: 27, }, { gender: 'female', age: 22, }, { gender: 'male', age: 29, }, ];
-> ๋จ์ฑ๋ค์ ํ๊ท ๋์ด๋?
function getAverageAgeOfMaleAtOnce(data) { const onlyMales = data.filter(function (d) { // data.filter๋ ๋ฐฐ์ด์ ๊ฐ ์์์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ์ ์ฉํ๊ณ , // ๊ทธ ๊ฒฐ๊ณผ๊ฐ true์ธ ์์๋ง์ ๊ฐ๋ ๋ฐฐ์ด์ ๋ฆฌํดํฉ๋๋ค. return d.gender === 'male'; }); const numOfMales = onlyMales.length; const onlyMaleAges = onlyMales.map(function (d) { // onlyMales.map๋ ๋ฐฐ์ด์ ๊ฐ ์์์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ์ ์ฉํ๊ณ , // ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์์๋ก ๊ฐ๋ ๋ฐฐ์ด์ ๋ฆฌํดํฉ๋๋ค. return d.age; }); const sumOfAges = onlyMaleAges.reduce(function (acc, cur) { // onlyMaleAges.reduce๋ ๋ฐฐ์ด์ ๊ฐ ์์์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ์ ์ฉํ๊ณ , // ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ด๊ธฐ๊ฐ(0)์ ๋์ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํฉ๋๋ค. return acc + cur; }, 0); return sumOfAges / numOfMales; }
-> ๋จ์ฑ์ ์ต์ฐ์ ๋์ด/์ต์ฐ์ฅ ๋์ด? ๋ฑ๋ฑ๋ฑ
์ด๋ ์ถ์ํ-> ๊ณ ์ฐจ ํจ์ ๊ฐ๊ฐ์ ์์ (filter, map, reduce) ํจ์ ๋ถ๋ฆฌ ํ compose์ ์ธ์๋ก ์ ๋ฌ๋๋ ์ฝ๋ฐฑํจ์
function getOnlyMales(data) { return data.filter(function (d) { return d.gender === 'male'; }); } function getOnlyAges(data) { return data.map(function (d) { return d.age; }); } function getAverage(data) { const sum = data.reduce(function (acc, cur) { return acc + cur; }, 0); return sum / data.length; } function compose(...funcArgs) { // compose๋ ์ฌ๋ฌ ๊ฐ์ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ๋ฆฌํดํ๋ ๊ณ ์ฐจ ํจ์์ ๋๋ค. // compose๊ฐ ๋ฆฌํดํ๋ ํจ์(์ต๋ช ํจ์)๋ ์์์ ํ์ ์ data๋ฅผ ์ ๋ ฅ๋ฐ์, return function (data) { // funcArgs์ ์์์ธ ํจ์๋ค์ ์ฐจ๋ก๋๋ก ์ ์ฉ(apply)์ํจ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํฉ๋๋ค. let result = data; for (let i = 0; i < funcArgs.length; i++) { result = funcArgs[i](result); } return result; }; } // compose๋ฅผ ํตํด ํจ์๋ค์ด ์์๋๋ก ์ ์ฉ๋๋ค๋ ๊ฒ์ด ์ง๊ด์ ์ผ๋ก ๋๋ฌ๋ฉ๋๋ค. // ๊ฐ๊ฐ์ ํจ์๋ ๋ค๋ฅธ ๋ชฉ์ ์ ์ํด ์ฌ์ฌ์ฉ(reuse) ๋ ์ ์์ต๋๋ค. const getAverageAgeOfMale = compose( getOnlyMales, // ๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ์ ๋ฐฐ์ด์ ๋ฆฌํดํ๋ ํจ์ getOnlyAges, // ๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ์ ๋ฐฐ์ด์ ๋ฆฌํดํ๋ ํจ์ getAverage // ๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ์ `number` ํ์ ์ ๋ฆฌํดํ๋ ํจ์ ); const result = getAverageAgeOfMale(data); console.log(result); // --> 26
๋ฐ์ํ'codeStates front-end > Java Script' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] chapter15. ๊ฐ์ฒด ์งํฅ - ํด๋์ค์ ์ธ์คํด์ค (0) 2023.01.13 [JS] chapter14. ๊ฐ์ฒด ์งํฅ - ํด๋ก์ ๋ชจ๋ ํจํด (1) 2023.01.13 [JS] chapter13. ๊ณ ์ฐจํจ์ (0) 2023.01.12 [JS] chapter12. ์ด๋ฒคํธ ๊ฐ์ฒด (0) 2023.01.06 [JS] chapter12. ์ ํจ์ฑ ๊ฒ์ฌ/ <์ค์ต> ํ์๊ฐ์ ๊ตฌํ / classList error (0) 2023.01.06