21.03.24 Underbar

J·2021년 3월 23일
0

_.pluck

객체 또는 배열을 요소로 갖는 배열과, 각 요소에서 찾고자 하는 key 또는 index를 입력받아
각 요소의 해당 값 또는 요소만을 추출하여 새로운 배열에 저장하고,
최종적으로 새로운 배열을 리턴합니다.

ex) let person = [{name: 'James', age: 30}, {name: 'Steve', age: 20}]
person의 age값만 가져오고 싶은 경우 -> _.pluck(person, 'age') === [30, 20]

  • 최종적으로 리턴되는 새로운 배열의 길이 === 입력으로 전달되는 배열의 길이
    찾고자 하는 key 또는 index를 가지고 있지 않은 요소의 경우, return undefined

.each를 사용한 .pluck

_.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)와 같다.

.map을 사용한 .pluck

  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

_.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;
};

0개의 댓글