1. each
// [ for-each ]
// 1. collection(๋ฐฐ์ด ํน์ ๊ฐ์ฒด)๊ณผ ํจ์ iteratee(๋ฐ๋ณต๋๋ ์์
)๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ (iteratee๋ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋๋ ํจ์์ด๋ฏ๋ก callback ํจ์)
// 2. collection์ ๋ฐ์ดํฐ(element ๋๋ property)๋ฅผ ์ํํ๋ฉด์
// 3. iteratee์ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ์ ๋ฌํ์ฌ ์คํํฉ๋๋ค.
_.each = function (collection, iteratee) {
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
if (Array.isArray(collection)) {
for (let idx = 0; idx < collection.length; idx++) {
iteratee(collection[idx], idx, collection);
}
} else {
for (let key in collection) {
iteratee(collection[key], key, collection);
}
}
};
// [1,2,3,4]
// 1 2 3 4
2. reduce
// ํ๋๋ก ์์ถ ์์ผ์ฃผ๋ ํจ์ ?
// ์๋ฅผ ๋ค๋ฉด sum(ํฉ๊ณ) ๋ง๋ค ๋... ์ ์ฌ์ฉ๋๋ค....
// 1. ๋ฐฐ์ด์ ์ํํ๋ฉฐ ๊ฐ ์์์ iteratee ํจ์๋ฅผ ์ ์ฉํ๊ณ ,
// 2. ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๊ณ์ํด์ ๋์ (accumulate)ํฉ๋๋ค.
// 3. ์ต์ข
์ ์ผ๋ก ๋์ ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํฉ๋๋ค.
// ์๋ฅผ ๋ค์ด, ๋ฐฐ์ด [1, 2, 3, 4]๋ฅผ ์ ๋ถ ๋ํด์ 10์ด๋ผ๋ ํ๋์ ๊ฐ์ ๋ฆฌํดํฉ๋๋ค.
// ๊ฐ ์์๊ฐ ์ฒ๋ฆฌ๋ ๋๋ง๋ค ๋์ ๋๋ ๊ฐ์ ์ฐจ๋ก๋๋ก 1, 1+2, 1+2+3, 1+2+3+4 ์
๋๋ค.
// ์ด์ฒ๋ผ _.reduce๋ ๋ฐฐ์ด์ด๋ผ๋ ๋ค์์ ์ ๋ณด๊ฐ ํ๋์ ๊ฐ์ผ๋ก ์ถ์(์์ถ, ํ์, reduction)๋๊ธฐ ๋๋ฌธ์ reduce๋ผ๋ ์ด๋ฆ์ด ๋ถ๊ฒ ๋ ๊ฒ์
๋๋ค.
* input ๊ฐ์ด [1,2,3,4] , ์ด๊ธฐ๊ฐ 0 .
_.reduce = function (arr, iteratee, initVal) {
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
let accumulator = initVal;
_.each(arr, function (item, idx, src) {
// initVal์ด ์๊ณ ์ธ๋ฑ์ค๊ฐ 0๋ฒ์งธ์ด๋ฉด
// ์ด๊ธฐ๊ฐ์ ๋ฃ์ด์ค๋ค
if (initVal === undefined && idx === 0) {
accumulator = item;
} else {
accumulator = iteratee(accumulator, item, idx, src);
}
});
return accumulator;
};
1. filter
// array ์์ ์กฐ๊ฑด์ ๋ง๋ ๊ฐ? ๋ง ๊ฐ์ง๊ณ ์ค๋ ค๊ณ ์ฐ๋ ... ํจ์(๊ธฐ๋ฅ)
// _.filter๋ ์ง์ํ๋ณ ํจ์๋ฅผ ํต๊ณผํ๋ ๋ชจ๋ ์์๋ฅผ ๋ด์ ์๋ก์ด ๋ฐฐ์ด์ ๋ฆฌํดํฉ๋๋ค.
// ์ง์ํ๋ณ(element)์ ๊ฒฐ๊ณผ(return ๊ฐ)๊ฐ truthy์ผ ๊ฒฝ์ฐ, ํต๊ณผ์
๋๋ค.
-- ํต๊ณผ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ํ์ํ ๊ฒ ๊ฐ๋ค...
?
// ๋ฐฐ์ด ์์ ํ๊ฐ์ฉ ๋ถ๋ฌ์ค๋ function ํจ์๋ค.
_.each = function (collection, iteratee) {
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
if (Array.isArray(collection)) {
for (let i = 0; i < collection.length; i++) {
iteratee(collection[i], i, collection);
}
} else {
for (let el in collection) {
iteratee(collection[el], el, collection)
}
}
};
// ์ด each ๋ฅผ ์ฌ์ฉํด์ ์์์ ์ค๋ช
ํ filter ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
// arr = ๋ฐฐ์ด
// ์ง์ํ๋ณ = ์กฐ๊ฑด ? ๊ฒ์ฆ์ ?
_.filter = function (arr, ์ง์ํ๋ณ) {
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
// ๋ณ์ ์ ์ธ
const result = []; // ์ด๋ค true ๋ก ํต๊ณผ๋ ๋ฐ์ดํฐ๋ค์ ๋ฐ๋ก ๋ชจ์๋ ๋ฐฐ์ด ๊ณต๊ฐ ์ ์ธ
// ๋ฐฐ์ด ๊ฐ ํ๋์ฉ ๊ฒ์ฌ
-.each(arr,(์ง์ํ๋ณ ์ธ์ ๊ฐ)=>{
// ์ง์ํ๋ณ ๊ฐ์ด true ๋ ?
// ์ง์ํ๋ณ ===> ์ธ์๊ฐ ์ง์ํ๋ณ ์กฐ๊ฑด์ ๋ถํฉํ๋ ์ง์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ์ true ๋ก ๋ฑ์ด ์ค๊ฑฐ์
if (์ง์ํ๋ณ(์ง์ํ๋ณ ์ธ์๊ฐ)){
result.push(์ง์ํ๋ณ๊ฐ);
}
})
return result;
};
_.filter = function (arr, test) {
// TODO: ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
let result = [];
// ๊ฒ์ฌ์ ๋นผ์
์ง์ ๋ง๋๋ function (item) {
if(item % 2 === 0)
{
return true;
}
}
// === => ==
// ๋ฑ์ด๋ด๋ true ํ์
์ ์ ๋งคํ ๋ฌด์ธ๊ฐ์ ๋ฌธ์ ๊ฐ.... ?
// ์ง์ ํ๋ณ
_.each(arr, ์ง์ ๋ง๋๋ function (item) {
if (item % 2 == 0) {
result.push(item);
}
})
// ๋ฌธ์์ด ํ์ธ
_.each(arr, function (item) {
if (String(item).length >= 6) {
result.push(item);
} })
//
_.each(arr, function (item) {
// if ๋ฌธ ์์๋ true ์ธ ๊ฑฐ๋ง ์์ ์๊ฒ
// ๊ฒ์ฌ์์ ๋ค๋ฅธ function ์ผ๋ก ๋นผ์ ๋ง๋๋๊ฑฐ
// ์๋ ํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์์ !
if (item === true) {
result.push(item);
}
})
return result;
};
[ once() ]
* ์ด๋ฅผ ํ์ฉํ์ฌ ๊ธฐ์กด ํจ์๊ฐ ์ฌ๋ฌ ๋ฒ ์คํ๋๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ณ๋๋๋ ํจ์๋ฅผ, ํ ๋ฒ ๋ฆฌํด๋ ๊ฐ๋ง ๋ฆฌํดํ๊ฒ ํ๋ ํจ์(_.once)
1. ์คํ ์ฌ๋ถ ํ๋ณํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ณ ๋ฏผ
2. ํ๋ฒ ์ด๋ฏธ ์ํ์ด ๋์์ผ๋ฉด ์ฒ์ return ๊ฐ์ด
// ์ด ํจ์ ๋ฑ ํ๋ฒ๋ง ๋๊ฒ ๊ฒ์ฌํด์ .. ํ๋ฒ ๋ฆฌํด๋ ๊ฐ๋ง ๋ฆฌํดํ๊ฒ... "once"
//
_.once = function(func) {
// ์ ์ธํ ๋ณ์
// 1. function ์ด ๋์๋์ง ํ์ธํ ์ ์๋ ๋ณ์
// 2. return ๊ฐ
let functioncalledyn = false; //true
let result;
return function(...args){
// spread syntax : ๋ฐฐ์ด ๊ฐ ๋ฏ์ด์.. ์ฌ์ฉํ ์ ์๊ฒ es6 ๋ถํฐ ๋์จ ๋ฌธ๋ฒ
if(functioncalledyn === false){
result = func(...args);
functioncalledyn = true;
}
return result;
}
};