Jieunny์ ๋ธ๋ก๊ทธ
S2) Unit3. [์ค์ต] Underbar ๋ณธ๋ฌธ
๐ฃ js ๋ฉ์๋ค์ ์ง์ ๊ตฌํํด๋ณด์
โฐ ๊ตฌํํ๋ฉด์ ํท๊ฐ๋ ธ๊ฑฐ๋ ํค๋งธ๋ ๋ฉ์๋๋ค๋ง ์ ๋ฆฌ
1๏ธโฃ reduce
โฐ ๋ฐฐ์ด์ ์ํํ๋ฉฐ ๊ฐ ์์์ iteratee ํจ์๋ฅผ ์ ์ฉํ๋ค.
โฐ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๊ณ์ ๋์ ํ๋ค.
โฐ ์ต์ข ์ ์ผ๋ก ๋์ ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํ๋ค.
โฐ iteratee(acc, ele, idx, arr) -> ์ฐจ๋ก๋๋ก ๋์ ๊ฐ, ๋ฐ์ดํฐ, ์ ๊ทผ์, collection
_.reduce = function (arr, iteratee, initVal) {
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
let result = initVal;
_.each(arr, function(ele, idx, arr){
if(result === undefined){
result = arr[0];
}
else {
result = iteratee(result, ele, idx, arr);
}
});
return result;
};
โฐ result : ๋์ ํ ๋ณ์
โฐ each๋ก ๋ฐฐ์ด์ ์๋ ์์๋ฅผ ํ๋์ฉ ๋๋ค.
โฐ ํจ์ ๋งค๊ฐ๋ณ์๋ก initVal์ด ์ฃผ์ด์ง์ง ์์๋ค๋ฉด undefined์ด๋ฏ๋ก ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ์ด๊ธฐ๊ฐ์ผ๋ก ์ค๋ค.
โฐ ์ด๊ธฐ๊ฐ์ด ์๋ค๋ฉด, ๊ทธ ์ด๊ธฐ๊ฐ์ iteratee ๋์ ๊ฐ์ผ๋ก ์ค๋ค.
โฐ iteratee ์ ๊ณ์ result๋ฅผ ์ฃผ๊ณ , ๊ทธ ๊ฐ์ ๋ค์ result์ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๊ณ์ ๋์ ๋๋ค.
2๏ธโฃ once
โฐ ์ฝ๋ฐฑํจ์๋ฅผ ํ๋ฒ๋ง ํธ์ถํ๋ ํจ์๋ฅผ ๋ฆฌํดํ๋ค.
โฐ once๊ฐ ๋ฆฌํดํ๋ ํจ์๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํด๋ ์ฝ๋ฐฑํจ์๋ ํ ๋ฒ ์ด์ ํธ์ถ๋์ง ์๋๋ค.
_.once = function (func) {
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
let isCalled = false;
let result;
return function () {
// TIP: arguments ํค์๋ ํน์, spread operator๋ฅผ ์ฌ์ฉํ์ธ์.
if(isCalled === false){
result = func(...arguments); //arguments๋ ์ฝ๋ฐฑํจ์์ ์ธ์
isCalled = true;
}
return result;
};
};
โฐ ์ฝ๋ฐฑํจ์๊ฐ ํธ์ถ๋๋ฉด isCalled ๋ฅผ true๋ก ๋ฐ๊ฟ์ ๋ ์ด์ ํธ์ถ๋์ง ์๊ฒ ํ๋ค.
3๏ธโฃ defaults
โฐ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ ๋ ฅ๋ฐ์, ์์๋๋ก ๊ฐ์ฒด๋ฅผ ๊ฒฐํฉํ๋ค.
โฐ ์ฒซ๋ฒ์งธ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ ์๋ ์์ฑ์ ๋ฎ์ด์ฐ์ง ์๋๋ค.
โฐ ์ต์ข ์ ์ผ๋ก ์์ฑ์ด ์ถ๊ฐ ๋ ์ฒซ๋ฒ์งธ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค.
_.defaults = function (obj, ...rest) {
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
_.each(rest, function(obj2){
for(let key in obj2){
if(obj.hasOwnProperty(key) === false){
obj[key] = obj2[key];
}
}
});
return obj;
};
โฐ ๊ฐ์ฒด๊ฐ ๋ช๊ฐ ๋ค์ด์ฌ์ง ๋ชจ๋ฅด๋ spread๋ก ์ธ์๋ฅผ ๋ฐ์์จ๋ค.
โฐ ๋ค์ด์จ ๊ฐ์ฒด๋ฅผ each๋ก ํ๋์ฉ ๋์์ฃผ๊ณ , ๊ฐ ๊ฐ์ฒด์ key๋ฅผ for๋ฌธ์ผ๋ก ๋์์ค๋ค.
โฐ hasOwnProperty(key) ํจ์๋ ๊ฐ์ฒด๊ฐ key๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฆฌํดํด์ค๋ค.
โฐ ๋ง์ฝ obj2์ ์๋ key๊ฐ obj์๋ ์๋ค๋ฉด ์ถ๊ฐํด์ค๋ค.
4๏ธโฃ zip
โฐ ์ฌ๋ฌ ๊ฐ์ ๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ์, ๊ฐ์ index์ ์์๋ค์ ๋ฌถ์ด ๋ฐฐ์ด๋ก ๋ง๋ ๋ค.
โฐ ์ต์ข ์ ์ผ๋ก ๋ฆฌํด๋๋ ๋ฐฐ์ด์ ๊ฐ ์์์ ๊ธธ์ด๋ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋๋ ๋ฐฐ์ด ์ค ๊ฐ์ฅ ๊ธด ๋ฐฐ์ด์ ๊ธธ์ด๋ก ํต์ผํ๋ค.
_.zip = function (...rest) {
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
let result = [] ;
let maxLength = 0;
_.each(rest, function(arr){
if(arr.length > maxLength){
maxLength = arr.length;
}
});
for(let i=0; i<maxLength; i++){
let addArr = [];
_.each(rest, function(arr){
if(arr[i] === undefined){
addArr.push(undefined);
}
else {
addArr.push(arr[i]);
}
});
result.push(addArr);
}
return result;
};
โฐ ๊ฐ index ๊ฐ์ ๋ฌถ์ ์ผ์ฐจ์ ๋ฐฐ์ด์ ๋ค์ ๋ค๋ฅธ ๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๋ ํ์์ผ๋ก ๊ตฌํํ๋ค.
โฐ ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ ๋ฐฐ์ด ์ค ๊ฐ์ฅ ๊ธด ๊ธธ์ด๋ฅผ maxLength์ ๋ฃ์ด์ฃผ๊ณ , for๋ฌธ์ maxLength๊น์ง ์ํํ๋ค.
โฐ ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ ๋ฐฐ์ด์ each๋ก ํ๋์ฉ ์ํํ๋ค.
โฐ ๋ง์ฝ ๊ธธ์ด๊ฐ ์์์ undefined์ด๋ผ๋ฉด ์ถ๊ฐํ ๋ฐฐ์ด์๋ undefined๋ฅผ ๋ฃ์ด์ค๋ค.
โฐ undefined์ด ์๋๋ผ๋ฉด ๊ทธ ๊ฐ์ ์ถ๊ฐํ ๋ฐฐ์ด์ ๋ฃ์ด์ค๋ค.
โฐ for๋ฌธ์ด ๋๋ ๋๋ง๋ค addArr์ result์ ๋ฃ์ด์ฃผ๊ณ , addArr์ ๋ค์ ์ด๊ธฐํํด์ค๋ค.
5๏ธโฃ sortBy
โฐ ๊ฐ ์์์ ํจ์ transform์ ์ ์ฉํ์ฌ ์ป์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
โฐ transform์ด ์ฃผ์ด์ง์ง ์์ ๊ฒฝ์ฐ ๋ฐฐ์ด ์์์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
โฐ order๊ฐ ์ฃผ์ด์ง์ง ์๊ฑฐ๋ 1์ธ ๊ฒฝ์ฐ ์ค๋ฆ์ฐจ์, -1์ธ ๊ฒฝ์ฐ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
_.sortBy = function (arr, transform, order) {
if(transform === undefined){
transform = _.identity;
}
if(order === undefined){
order = 1;
}
arr = [...arr];
if(typeof arr[0] === 'string'){
if(transform !== _.identity){
arr.sort(function(a, b){
if(order === 1){
return transform(a) - transform(b);
}
else if(order === -1){
return transform(b) - transform(a);
}
});
}
else{
if(order === 1){
arr = arr.sort();
}
else if(order === -1){
arr = arr.sort().reverse();
}
}
}
else{
arr.sort(function(a, b) {
a = transform(a);
b = transform(b);
if(order === 1){
return a - b;
}
else if(order === -1){
return b - a;
}
});
}
return arr;
};
โฐ ๋ ๊น๋ํ๊ฒ ๊ตฌํํ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ ๊ฐ์๋ฐ.....
โฐ ๋ฐฐ์ด ์์๊ฐ string์ผ ๊ฒฝ์ฐ && transform์ด ์ฃผ์ด์ง์ง ์์ ๊ฒฝ์ฐ์๋ sort()๋ก ๋ฐ๋ก ์ ๋ ฌ ๊ฐ๋ฅํ๋ค.
โฐ string์ด ์๋ ๊ฒฝ์ฐ(number์ผ ๊ฒฝ์ฐ), sortํจ์๋ ๋ฌธ์์ด์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ฐฑ ํจ์๋ก ์กฐ๊ฑด์ ์ฃผ์ด์ผ ํ๋ค.
6๏ธโฃ memoize
โฐ ์ฝ๋ฐฑํจ์์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ ์ฉํ๋ค.
โฐ ๋ฉ๋ชจ์ด์ ์ด์ : ์ด๋ฏธ ํด๊ฒฐํ ๋ฌธ์ ๋ ๋ค์ ํ์ง ์๋ ๊ธฐ๋ฒ
โฐ ์์ ์งํํ๋ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด๋๊ณ ๊ฐ์ ์ฐ์ฐ์ด ๋ค์ด์จ ๊ฒฝ์ฐ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํด์ค๋ค.
_.memoize = function (func) { // ์บ์๊ธฐ๋ฅ?
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
let memo = {}; // ์ ์คํ ๊ฐ ์ ์ฅํ๋ ๊ณณ
return function(...arguments){ //func ๋งค๊ฐ๋ณ์๋ก ๋ญ๊ฐ ๋ค์ด์ฌ์ง ๋ชจ๋ฅด๋
let key = JSON.stringify(...arguments); // ๊ฐ์ฒด์ ํค๋ก ๋ฃ์ด์ฃผ๊ธฐ ์ํด์ json.stringify ์ฌ์ฉ
if(memo[key] === undefined){ // memo์ ์๋ค๋ฉด
memo[key] = func(...arguments) // ๊ฐ ๋ฃ์ด์ฃผ๊ธฐ
}
return memo[key]; // memo์์ ๊ฐ ๊บผ๋ด์ ๋ฆฌํดํด์ฃผ๊ธฐ
}
};
โฐ ์ด๋ฏธ ์งํํ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ํจ์์ ์ธ์๋ก ๋ค์ด์จ ๊ฐ์ key๋ก ๋ฃ์ด์ค๋ค.
โฐ ๊ทธ ํค์ ๊ฐ์ด ์๋ค๋ฉด ์ฐ์ฐํ ์ ์ด ์๋ ๊ฒ์ด๋ฏ๋ก ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ๋ฆฌํดํ๋ค.
โฐ ์ด๋ฏธ ๊ทธ ํค์ ๊ฐ์ด ์๋ค๋ฉด ์ฐ์ฐํ ์ ์ด ์๋ ๊ฒ์ด๋ฏ๋ก ์ ์ฅ๋ ๊ฐ์ฒด์์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
7๏ธโฃ throttle
โฐ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋๋ ์๊ฐ ๋์์ ์ฝ๋ฐฑํจ์๋ฅผ ๋จ ํ๋ฒ๋ง ์คํํ๋ ํจ์๋ฅผ ๋ฐํํ๋ค.
_.throttle = function (func, wait) {
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
let canStartCallback = true;
return function(){
if(canStartCallback){
func();
canStartCallback = false;
setTimeout(function(){
canStartCallback = true;
}, wait)
}
}
};
โฐ canStartCallback์ผ๋ก ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
โฐ ์ฒ์ ์คํํ์ ๋ ์ฝ๋ฐฑํจ์๋ฅผ ์คํํด์ฃผ๊ณ ์คํ ์ฌ๋ถ๋ฅผ false๋ก ๋ฐ๊ฟ์ค๋ค.
โฐ setTimeout์ผ๋ก wait ์๊ฐ๋งํผ ๊ธฐ๋ค๋ฆฐ ๋ค ์คํ ์ฌ๋ถ๋ฅผ true๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๊ทธ ์๊ฐ ๋์์๋ ์ฝ๋ฐฑ ํจ์๊ฐ ํ๋ฒ๋ง ํธ์ถ ๋๋ค.
๐ argument, spread, ์ฝ๋ฐฑํจ์๋ฅผ ์ฐ์ตํ๊ธฐ์ ์ข์ ๊ณผ์ ์๋ค.
'CodeStates > Training' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
S2) Unit3. [์ค์ต] fs ๋ชจ๋ (0) | 2023.01.19 |
---|---|
S2) Unit3. [์ค์ต] ํ์ด๋จธ API (0) | 2023.01.18 |
S2) Unit2. [์ค์ต] Beesbeesbees (0) | 2023.01.16 |
[์ฝํ๋ฆฟ] Daily Coding (0) | 2023.01.13 |
Unit 11. [์ค์ต] ๋๋ง์ ์๊ณ ๋ผ ์คํ ์ด์ธ ๋ง๋ค๊ธฐ (0) | 2023.01.10 |