reduce

devjune·2021년 9월 26일
0

ES5

목록 보기
6/14

reduce 함수의 용도는 받은 인자로 새로운 결과를 도출하기 위해 사용한다.

var add = _curry(function(a, b) {
  return a + b;
});

function _reduce(list, iter, memo) {

}

_reduce([1, 2, 3], add, 0); // 6

//reduce의 동작 방식은 다음과 같이 구현한다.
memo = add(0, 1);
memo = add(memo, 2);
memo = add(memo, 3);
return memo;

위 코드를 적용시키면 reduce함수는 다음과 같이 구현할 수 있다.

function _reduce(list, iter, memo) {
  return iter(iter(iter(0, 1), 2), 3), 4);
}
function _reduce(list, iter, memo) {
  _each(list, function(val) {
    memo = iter(memo, val);
  });
  return memo;
}

console.log([1, 2, 3], add, 0)); // 6
console.log([1, 2, 3], add, 10)); // 16

만약 3번째 인자인 memo가 없다면 list의 첫번째 값을 memo로 사용하게 만들어 준다면 다음과 같이 만들 수 있다.

function _reduce(list, iter, memo) {
  if (arguments.length == 2) {
    memo = list[0];
    list = list.slice(1);
  }
  _each(list, function(val) {
    memo = iter(memo, val);
  });
  return memo;
}

하지만 slice는 Array 객체에 한해 사용할 수 있는 메소드이다.
즉, reduce함수는 이제 list인자를 array로만 받을 수 있다는 뜻이다.

먼저 slice()의 동작 원리를 알아보자.

var a = [1, 2, 3];

a.slice(1); // [2, 3];
a.slice(2); // [3];

이렇게 받은 인자만큼의 배열 요소를 앞에서 부터 삭제한 새로운 배열을 반환한다.
즉, a는 그대로 [1, 2, 3]인 것이다.

var a = document.querySelectorAll('*');
a.slice(1); // a.slice is not a function

slice 메소드는 Array객체에서만 사용이 가능하기 때문에 Array가 아니라면 사용이 불가하다.

하지만, 사용할 수 있는 방법이 있는데 다음과 같다.

var slice = Array.prototype.slice;

slice.call(a, 2); // [meta, title, script, ...]

이렇게 slice 메소드를 이용하면, Array가 아니더라도 배열과 같이 동작한다면 사용할 수 있다.

var slice = Array.prototype.slice;
function _rest(list, num) {
  return slice.call(list, num || 1);
}

function _reduce(list, iter, memo) {
  if (arguments.length == 2) {
    memo = list[0];
    list = _rest(list);
  }
  _each(list, function(val) {
    memo = iter(memo, val);
  });
  return memo;
}

console.log(_reduce([1, 2, 3], add)); // 6
profile
개발자준

0개의 댓글