_underBar 프로젝트
고차함수와 여러 메소드를 스스로 만들어보며 공부 관련 포스팅입니다.
_.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; //
};
새로운 배열 얕은 복사를 하는것이 포인트 입니다.
// _.take는 배열의 처음 n개의 element를 담은 새로운 배열을 리턴합니다.
// n이 undefined이거나 음수인 경우, 빈 배열을 리턴합니다.
// n이 배열의 길이를 벗어날 경우, 전체 배열을 shallow copy한 새로운 배열을 리턴합니다.
_.take = function (arr, n) {
if(n === undefined || n < 0) n =0;
else if( n > arr.length) n = arr.length;
}
for(let i = 0; i < n; i++;){
result.push(arr[i];
}
return result;
_.drop = function (arr, n) {
// TODO: 여기에 코드를 작성합니다.
let result = [];
if ( n === undefined || n < 0){
return arr;
} else if( n > arr.length){
return []
}
for(let i = n; i < arr.length; i++){
result.push(arr[i]); // arr.shift 로 빼기
}
return result;
};
_.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 i in collection){
iteratee(collection[i] , i , collection)
}
}
};
arr.forEach를 사용하는 이유는 for 문 대신 사용하는 용도입니다.
// _.indexOf는 target으로 전달되는 값이 arr의 요소인 경우, 배열에서의 위치(index)를 리턴합니다.
// 그렇지 않은 경우, -1을 리턴합니다.
// target이 중복해서 존재하는 경우, 가장 낮은 index를 리턴합니다.
_.indexOf = function (arr, target) {
// 배열의 모든 요소에 접근하려면, 순회 알고리즘(iteration algorithm)을 구현해야 합니다.
// 반복문을 사용하는 것이 가장 일반적이지만, 지금부터는 이미 구현한 _.each 함수를 활용하여야 합니다.
// 아래 _.indexOf의 구현을 참고하시기 바랍니다.
let result = -1;
_.each(arr, function (item, index) {
if (item === target && result === -1) {
result = index;
}
});
return result;
};
indexOf() 메서드는 배열에서 지정된 요소를 찾을 수 있는 첫번째 인덱스를
반환하고 존재 않으면 -1을 반환합니다.