객체 또는 배열을 요소로 갖는 배열과, 각 요소에서 찾고자 하는 key 또는 index를 입력받아
각 요소의 해당 값 또는 요소만을 추출하여 새로운 배열에 저장하고,
최종적으로 새로운 배열을 리턴합니다.
ex) let person = [{name: 'James', age: 30}, {name: 'Steve', age: 20}]
person의 age값만 가져오고 싶은 경우 -> _.pluck(person, 'age') === [30, 20]
- 최종적으로 리턴되는 새로운 배열의 길이 === 입력으로 전달되는 배열의 길이
찾고자 하는 key 또는 index를 가지고 있지 않은 요소의 경우, return undefined
_.pluck = function (arr, keyOrIdx) {
let result = [];
_.each(arr, function (item) {
// item: arr의 어떠한 요소
// 예제에선 person[0] === {name: 'James', age: 30}
// person[1] === {name: 'Steve', age: 20}
result.push(item[keyOrIdx]);
// 내가 원하는 keyOrIdx push
// 예제에선 person[0]['age'] || person[1]['age']
});
return result; // [30, 20] -> 원본 배열의 길이(2)와 같다.
return _.map(arr, function(el) {
// _.each 예제와 똑같이 el === person[0], person[1]의 요소를 가져온다
return el[keyOrIdx];
// el['age'] === [30, 20]
// _.map은 각 요소에 iteratee가 적용된 결과가 자동으로 push되니까 바로 return el[keyOrIdx]
})
};
_.reduce = function (arr, iteratee, initVal) {
let acc = initVal;
// 누산값은 숫자일 수도, 배열일 수도, 객체일 수도, boolean일 수도 있기 때문에 initVal 로 설정(결과의 형식을 정해준다.)
_.each(arr, function(ele, idx) {
if (acc === undefined) { // 초기값이 없는 경우
acc = ele;
// 기본적으로 _.reduce는 누산값(acc)을 return 해야 한다.
// 초기값이 없는 경우
// _.each(arr, function(ele, idx) 이 부분에서
// iteratee === function(ele, idx)가 되는데,
// 이 경우 인자로 ele(데이터), idx(접근자)는 있지만, collection은 없다
// 왜냐하면 어차피 collection === 배열이니까
// 이후 초기(누산)값으로 설정했던 acc === initVal === undefined이므로
// 초기값으로 배열의 0번째 요소가 할당된다.
// 그래서 최초 ele 가 누산값이자 초기값으로 설정된다.
// 그 다음 다시 _.each메소드를 돌게 되고
// 그 후엔 초기값이 있으므로(acc === 첫 번째 ele)
// else로 빠진다
// 그러면 이제 iteratee(누산값, 현재값(이 경우 2번째 idx), 현재값의 idx([1]), 원본참조(배열))가 돌게 된다.
// 이후 계속 else로 반복
} else { // 초기값이 있는 경우
acc = iteratee(acc, ele, idx, arr);
}
})
return acc;
};