_.slice = function (arr, start, end) {
let _start = start || 0,
_end = end;
if (start < 0) _start = Math.max(0, arr.length + start);
if (end < 0) _end = Math.max(0, arr.length + end);
if (_end === undefined || _end > arr.length) _end = arr.length;
let result = [];
for (let i = _start; i < _end; i++) {
result.push(arr[i]);
}
return result; //immutable
};
_.take = function (arr, n) {
if (n === undefined || n < 0 || n === 0) return [];
if (n > arr.length) return arr;
return _.slice(arr, 0, n); //처음 n개의 element를 담은 새로운 배열 리턴
};
_.drop = function (arr, n) {
if (n === undefined || n < 0 || n === 0) return _.slice(arr);
if (n > arr.length) return [];
return _.slice(arr, n); //_.slice(arr,n,arr.length)와 같음
};
_.each = function (collection, iteratee) {
if (Array.isArray(collection)) {
for (let i = 0; i < collection.length; i++) {
iteratee(collection[i], i, collection);
}
} else if (typeof collection === "object") {
for (let key in collection) {
iteratee(collection[key], key, collection);
}
}
};
//_.each를 이용한 방법
let result = [];
_.each(arr, function (item) {
result.push(item[keyOrIdx]);
});
return result;
//_.map을 이용한 방법
// 내가 짠 코드
let result = [];
_.map(arr, (item) => {
return item ? result.push(item[keyOrIdx]) : undefined;
});
return result;
//다른 방법
return _.map(arr, (arr) => arr[keyOrIdx]);
pluck 함수는 설명부터 제대로 이해가 안 가서 다시 천천히 봐야겠다.
오늘은 underscore.js에 있는 Docs를 토대로 비슷하게 구현을 시간을 가졌는데 Bare Minimum은 그나마 괜찮았는데 Advanced부터 막히기 시작했다... 클로저랑 비동기 함수가 힌트로 주어지긴 했는데 그래도 접근을 어떻게 해야할지 감이 안온다. 나중에 꼭 풀어봐야지.
아무튼 이번 과제를 통해 느낄 수 있었던 것은 이렇게 구현한 함수를 통해서 기존 코드를 리팩토링하거나 새로운 프로젝트에 접근할 수 있지 않을까라는 생각을 했다. 어렵지만 좋은 경험이었다.