Jieunny์ ๋ธ๋ก๊ทธ
S2) Unit 1. [JS] ๊ณ ์ฐจํจ์ ๋ณธ๋ฌธ
๐ฃ ์ผ๊ธ ๊ฐ์ฒด
โ๏ธ JS์์ ํน๋ณํ๊ฒ ์ทจ๊ธ๋๋ ๊ฐ์ฒด <ํจ์>
โฐ ๋ณ์์ ํ ๋น ํ ์ ์๋ค.
โฐ ๋ค๋ฅธ ํจ์์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋ ์ ์๋ค.
โฐ ๋ค๋ฅธ ํจ์์ ๊ฒฐ๊ณผ๋ก์ ๋ฆฌํด๋ ์ ์๋ค.
๐ฃ ๊ณ ์ฐจ ํจ์
โ๏ธ ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ์ ์ ์๊ณ , ํจ์๋ฅผ ๋ฆฌํดํ ์ ์๋ ํจ์
โฐ ๋ค๋ฅธ ํจ์์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋๋ ํจ์ <์ฝ๋ฐฑ ํจ์>
โฐ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌ ๋ฐ์ ๊ณ ์ฐจ ํจ์๋ ๋ด๋ถ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถ ํ ์ ์๊ณ , ์กฐ๊ฑด์ ๋ฐ๋ผ ์คํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์๋ ์๋ค.
โฐ ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์ <์ปค๋ง ํจ์> (๋ฐ๋ก ์ปค๋งํจ์ ๋ผ๋ ์ฉ์ด๋ฅผ ์ธ ํ์๋ ์๋ค)
โฐ ์ปค๋งํจ์ ⊂ ๊ณ ์ฐจ ํจ์
๐ฃ ๋ด์ฅ ๊ณ ์ฐจ ํจ์
1๏ธโฃ ๋ฐฐ์ด ๋ฉ์๋ filter(๊ฑธ๋ฌ๋ด๋ ๊ธฐ์ค)
๋ชจ๋ ๋ฐฐ์ด์ ์์ ์ค์์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ฅผ ๊ฑธ๋ฌ๋ด๋ ๋ฉ์๋
๊ฑธ๋ฌ๋ด๊ธฐ ์ํ ์กฐ๊ฑด์ ๋ช ์ํ ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ๋๋ค.
๋ฐฐ์ด์ ๊ฐ ์์์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ์ ์ฉํ๋ค.
์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด true, ์๋๋ฉด false๋ฅผ ๋ฐํํ๋ค.
true๋ฅผ ๋ฐํํ๋ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๊ท ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ฐํํ๋ค.
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;
};
// ํจ์ ํํ์
const isEven = function (num) {
return num % 2 === 0;
};
let arr = [1, 2, 3, 4];
// let output = arr.filter(์ง์);
// '์ง์'๋ฅผ ํ๋ณํ๋ ํจ์๊ฐ ์กฐ๊ฑด์ผ๋ก์ filter ๋ฉ์๋์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
let output = arr.filter(isEven); // 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']
๐ ๋ฌธ์
๋งํ์ฑ ์๊ฐ 27๊ถ์ ์ ๋ณด๊ฐ ๋ฐฐ์ด์ ๋ด๊ฒจ์์ต๋๋ค. ์ถํ ์ฐ๋๊ฐ 2003๋ ์ธ ๋จํ๋ณธ๋ง ๋ด์ ๋ฐฐ์ด์ ๋ง๋์ธ์.
โ๏ธ ํ์ด
// ๋จํ๋ณธ ๋ชจ์
const cartoons = [
{
id: 1,
bookType: 'cartoon',
title: '์๊ฐ',
subtitle: '์ด๋จธ๋์ ์',
createdAt: '2003-09-09',
genre: '์๋ฆฌ',
artist: 'ํ์๋ง',
averageScore: 9.66,
},
{
id: 2,
// .. ์ดํ ์๋ต
},
// ... ์ดํ ์๋ต
];
// ๋จํ๋ณธ ํ ๊ถ์ ์ถํ ์ฐ๋๊ฐ 2003์ธ์ง ํ์ธํ๋ ํจ์
const isCreatedAt2003 = function (cartoon) {
const fullYear = new Date(cartoon.createdAt).getFullYear()
return fullYear === 2003;
};
// ์ถํ ์ฐ๋๊ฐ 2003๋
์ธ ์ฑ
์ ๋ชจ์
const filteredCartoons = cartoons.filter(isCreatedAt2003);
2๏ธโฃ map
๋ชจ๋ ๋ฐฐ์ด์ ๊ฐ์ ํจ์๋ฅผ ์คํํ๋ ๋ฉ์๋์ด๋ค.
์ฝ๋ฐฑํจ์๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ ๋ค.
์ฝ๋ฐฑํจ์์ ๋ ๋ฒ์งธ ์ ๋ฌ์ธ์๋ฅผ ์ค ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ธ์จ๋ค.
๐ ๋ฌธ์
๋งํ์ฑ ์๊ฐ 27๊ถ์ ์ ๋ณด๊ฐ ๋ฐฐ์ด์ ๋ด๊ฒจ์์ต๋๋ค. ๊ฐ ์ฑ ์ ๋ถ์ (subtitle)๋ง ๋ด์ ๋ฐฐ์ด์ ๋ง๋์ธ์.
โ๏ธ ํ์ด
// ๋งํ์ฑ
๋ชจ์
const cartoons = [
{
id: 1,
bookType: 'cartoon',
title: '์๊ฐ',
subtitle: '์ด๋จธ๋์ ์',
createdAt: '2003-09-09',
genre: '์๋ฆฌ',
artist: 'ํ์๋ง',
averageScore: 9.66,
},
{
id: 2,
// .. ์ดํ ์๋ต
},
// ... ์ดํ ์๋ต
];
// ๋งํ์ฑ
ํ ๊ถ์ ๋ถ์ ๋ฅผ ๋ฆฌํดํ๋ ๋ก์ง(ํจ์)
const findSubtitle = function (cartoon) {
return cartoon.subtitle;
};
// ๊ฐ ์ฑ
์ ๋ถ์ ๋ชจ์
const subtitles = cartoons.map(findSubtitle); // ['์ด๋จธ๋์ ์', ...]
3๏ธโฃ reduce
๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ์ํํ๋ฉฐ ์ฝ๋ฐฑํจ์์ ์คํ ๊ฐ์ ๋์ ํ์ฌ ํ๋์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ค.
๋ฐฐ์ด์ด ๋ค์ด๊ฐ์ ํ๋์ ๊ฐ์ด ๋์จ๋ค.
์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ '์ด๊ธฐ๊ฐ' ๋๋ '๋์ ๊ฐ'
๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ 'ํ์ฌ๊ฐ'
๐ ๋ฌธ์
๋งํ์ฑ ์๊ฐ 27๊ถ์ ์ ๋ณด๊ฐ ๋ฐฐ์ด์ ๋ด๊ฒจ์์ต๋๋ค. ๊ฐ ๋จํ๋ณธ์ ํ์ ์ ํ๊ท ์ ๋ฆฌํดํ์ธ์.
โ๏ธ ํ์ด
// ๋จํ๋ณธ ๋ชจ์
const cartoons = [
{
id: 1,
bookType: 'cartoon',
title: '์๊ฐ',
subtitle: '์ด๋จธ๋์ ์',
createdAt: '2003-09-09',
genre: '์๋ฆฌ',
artist: 'ํ์๋ง',
averageScore: 9.66,
},
{
id: 2,
// .. ์ดํ ์๋ต
},
// ... ์ดํ ์๋ต
];
// ๋จํ๋ณธ ํ ๊ถ์ ํ์ ์ ๋์ ๊ฐ์ ๋ํ๋ค.
const scoreReducer = function (sum, cartoon) {
return sum + cartoon.averageScore;
};
// ์ด๊ธฐ๊ฐ์ 0์ ์ฃผ๊ณ , ์ซ์์ ํํ๋ก ํ์ ์ ๋์ ํ๋ค.
let initialValue = 0
// ๋ชจ๋ ์ฑ
์ ํ์ ์ ๋์ ํ ํ๊ท ์ ๊ตฌํ๋ค.
const cartoonsAvgScore = cartoons.reduce(scoreReducer, initialValue) / cartoons.length;
โฐ ๋ฐฐ์ด -> ๋ฌธ์์ด, ๋ฐฐ์ด -> ๊ฐ์ฒด ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
๐ ๋ฌธ์
๋ฐฐ์ด์ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ๋ผ.
โ๏ธ ํ์ด
// ์ฝ๋ฐฑ ํจ์ joinName์ users ๋ฐฐ์ด ์์ ์๋ ์์์ ์ด๋ฆ์ ํ๋๋ก ์์ถํ๋ค.
function joinName(resultStr, user) {
resultStr = resultStr + user.name + ', ';
return resultStr;
}
let users = [
{ name: 'Tim', age: 40 },
{ name: 'Satya', age: 30 },
{ name: 'Sundar', age: 50 }
];
users.reduce(joinName, '');
// 'Tim, Satya, Sundar, '
๐ ๋ฌธ์
๋ฐฐ์ด์ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ๋ผ.
โ๏ธ ํ์ด
// ์ฝ๋ฐฑ ํจ์ makeAddressBook์ users ๋ฐฐ์ด ์์ ์๋ ์์๋ก ์ฃผ์๋ก์ ๋ง๋ญ๋๋ค.
function makeAddressBook(addressBook, user) {
let firstLetter = user.name[0];
if(firstLetter in addressBook) {
addressBook[firstLetter].push(user); // ๋งจ ์๊ธ์๊ฐ ์ด๋ฏธ ๊ฐ์ฒด์ ์๋ ๊ฒฝ์ฐ
} else {
addressBook[firstLetter] = [];
addressBook[firstLetter].push(user);
}
return addressBook;
}
let users = [
{ name: 'Tim', age: 40 },
{ name: 'Satya', age: 30 },
{ name: 'Sundar', age: 50 }
];
users.reduce(makeAddressBook, {});
// {
// T: [
// { name: 'Tim', age: 40 }
// ],
// S: [
// { name: 'Satya', age: 30 },
// { name: 'Sundar', age: 50 }
// ]
//}
๐ฃ ๊ณ ์ฐจ ํจ์๋ฅผ ์ฐ๋ ์ด์
โ๏ธ ์ถ์ํ
๋ณต์กํ ์ด๋ค ๊ฒ์ ์์ถํด์ ํต์ฌ๋ง ์ถ์ถํ ์ํ๋ก ๋ง๋๋ ๊ฒ
์ถ์ํ๋ฅผ ์ด์ฉํ๋ฉด ํจ์จ์ ์ด๊ณ ํธํ๊ฒ ์๊ฐํ ์ ์๋ค.
์์ฐ์ฑ์ ํฅ์
โ๏ธ ์ถ์ํ์ ์ข์ ์ฌ๋ก์ธ ํจ์ -> ํจ์๋ ์ฌ๊ณ ๋๋ ๋ ผ๋ฆฌ์ ๋ฌถ์
ํจ์ = ๊ฐ์ ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋ฆฌํดํ๋ค = ๊ฐ์ ๋ํ ๋ณต์กํ ๋ก์ง์ ๊ฐ์ถ์ด์ ธ ์๋ค = ๊ฐ ์์ค์์์ ์ถ์ํ
๊ณ ์ฐจ ํจ์ = ํจ์๋ฅผ ์ ๋ฌ๋ฐ๊ฑฐ๋ ํจ์๋ฅผ ๋ฆฌํดํ๋ค = ์ฌ๊ณ (ํจ์)์ ๋ํ ๋ณต์กํ ๋ก์ง์ ๊ฐ์ถ์ด์ ธ ์๋ค = ์ฌ๊ณ ์์ค์์์ ์ถ์ํ
๐ ๋ฌธ์
์ฃผ์ด์ง ๋ฐ์ดํฐ์ ๋จ์ฑ๋ค์ ํ๊ท ๋์ด๋ฅผ ๊ตฌํด๋ผ.
// ์์ ๋ฐ์ดํฐ
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;
}
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๋ ์ฌ๋ฌ ๊ฐ์ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ๋ฆฌํดํ๋ ๊ณ ์ฐจ ํจ์์
๋๋ค.
// 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
๐จ ๊ณ ์ฐจ ํจ์๊ฐ ์๋ ๊ฒ
ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ์ง ์๊ณ , ํจ์๋ฅผ ๋ฆฌํดํ๊ณ ์์ง ์๋ค.
function calcuate(x, y, z){
const plus = function (num1, num2){
return num1 + num2;
}
return plus(x, y) * z
}
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
S2) Unit 2. [JS] ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ (0) | 2023.01.13 |
---|---|
S2) Unit 2. [JS] ํด๋์ค์ ์ธ์คํด์ค (0) | 2023.01.13 |
Unit 11. ํ์ด์ง ๋ค์ด์ & ์น ์คํ ๋ฆฌ์ง (0) | 2023.01.04 |
Section 1. [๊ธฐ์ ๋ฉด์ ] (0) | 2022.12.29 |
Unit 10. [JS/๋ธ๋ผ์ฐ์ ] ์ด๋ฒคํธ ๊ฐ์ฒด (0) | 2022.12.28 |