underbar
_.map = function (arr, iteratee) {
// TODO: 여기에 코드를 작성합니다.
// _.map 함수는 매우 자주 사용됩니다.
// _.each 함수와 비슷하게 동작하지만, 각 요소에 iteratee를 적용한 결과를 리턴합니다.
let result = [];
_.each(arr, function (item) {
result.push(iteratee(item));
});
return result;
};
_.pluck = function (arr, keyOrIdx) {
// _.pluck을 _.each를 사용해 구현하면 아래와 같습니다.
// let result = [];
// _.each(arr, function (item) {
// result.push(item[keyOrIdx]);
// });
// return result;
// _.pluck은 _.map을 사용해 구현하시기 바랍니다.
// TODO: 여기에 코드를 작성합니다.
return _.map(arr, function (item) {
return item[keyOrIdx];
});
};
_.reduce = function (arr, iteratee, initVal) {
// TODO: 여기에 코드를 작성합니다.
let accumulator = initVal;
_.each(arr, function (item, idx, src) {
if (initVal === undefined && idx === 0) {
accumulator = item;
} else {
accumulator = iteratee(accumulator, item, idx, src);
}
});
return accumulator;
};
_.once = function (func) {
// 아래 변수들은 아래 선언/리턴되는 함수 안에서 참조됩니다.
// 리턴되는 함수의 scope 내에 존재하므로, 리턴되는 함수를 언제 실행해도 이 변수들에 접근할 수 있습니다.
let result;
let alreadyCalled = false;
return function (...args) {
// TIP: arguments 키워드 혹은, spread operator를 사용하세요.
if (!alreadyCalled) {
alreadyCalled = true;
result = func(...args);
}
return result;
};
};
_.every = function (arr, iteratee) {
// TODO: 여기에 코드를 작성합니다.
if (iteratee === undefined) {
iteratee = _.identity;
}
for (let i = 0; i < arr.length; i++) {
if (!iteratee(arr[i])) {
return false;
}
}
return true;
};
Rest parameter vs Spread Syntax
- Rest parameter : 값들을 뭉쳐서 만드는 것.
함수에 전달된 인수들은 배열로 전달이 된다.