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