접기 - reduce, min_by, max_by

devjune·2021년 10월 4일
0

ES5

목록 보기
12/14

min은 가장 작은 값, max는 가장 큰 값을 리턴하는 함수이다.

function _each(list, iter) {
    var keys = _keys(list);
    for (var i = 0, len = keys.length; i < len; i++) {
        iter(list[keys[i]], keys[i]);
    }
    return list;
}

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

function _min(data) {
  return _reduce(data, function(a, b) {
    
  });
}

평가 순서와 상관없이 해당하는 결과를 만들 수 있는 식을 사고하는 방식이 중요하다.

자료구조를 넘길 때 값이 수의 순서대로 넘어오는 것이 아닌 랜덤으로 넘어올 수 있다는 식으로 생각해야 한다.

예를 들어 [1, 2, 4, 10, 5, -4]가 있을 때 모든 값을 평가한다 생각하고 프로그래밍을 해아한다.

function _min(data) {
  return _reduce(data, function(a, b) {
    return a < b ? a : b;
  });
}

_min([1, 2, -1, -3, 10]);

function _max(data) {
  return _reduce(data, function(a, b) {
    return a > b ? a : b;
  });
}

_max([1, 2, -1, -3, 10]);

min_by, max_by
어떤 조건을 통해서 비교를 할 것이냐를 추가적으로 iter를 받기 때문에 min, max보다 좀 더 추상적이다.

function _min_by(data, iter) {
  return _reduce(data, function(a, b) {
    return iter(a) < iter(b) ? a : b;
  });
}

_min_by([1, 2, 4, 10, 5, -4], Math.abs);

function _max_by(data, iter) {
  return _reduce(data, function(a, b) {
    return iter(a) > iter(b) ? a : b;
  });
}

_max_by([1, 2, 4, 10, 5, -11], Math.abs);

_max_by(users, function(user) {
  return user.age;
});
profile
개발자준

0개의 댓글