function _filter(users, predicate) {
var new_list = [];
_each(list, function() {
if(predi(val)) new_list.push(val);
});
return new_list;
}
console.log(
_filter(users, function(user) { return user.age >= 30; }));
// 재활용성과 다형성이 높은 함수
console.log(
_filter([1,2,3,4], function(num) { return num % 2; }));
function _map(list, mapper) {
var new_list = [];
_each(list, function(val) {
new_list.push(mapper(val));
});
return new_list;
}
function _each(list, iter) {
for (var i = 0; i< list.length; i++) {
iter(list[i]);
}
return list;
}
map, filter 같은 함수들은 javascript에 이미 있다. 그럼 왜 _map, _filter를 따로 구현했을까?
javascript의 map, filter는 순수함수가 아니라 메서드이다. 객체의 상태에 따라 결과값이 다르기 때문이다.
차이점 매서드는 해당 클래스의 인스턴스에서만 사용할 수 있는 객체지향 프로그램이다.
array_like, arguments, document.querySelectorAll 등은 Array가 아니라 유사배열이다.
console.log(document.querySelectorAll('*'));
// output : 유사객체가 나옴
console.log(document.querySelectorAll('*').map(function(noe) { return node.nodeName; });
// output : map은 메서드가 아닙니다.
// _map은 .length만 존재하면 사용 가능
// 유사객체에서도 사용 가능 외부 다형성
console.log(
_map(document.querySelectorAll('*'), function(node) { return node.nodeName; });
// output : []
// 다형성면에서 사용이 편하다.
// 유사배열이나 배열이나 동시에 같이 돌릴 수 있는 것은 _map의 함수의 구현방식에 따라 달라지므로 외부 다형성과 관련이 있다.
// 하지만 내부다형성(배열의 요소의 타입 등)은 predi, iter, mapper와 같은 보조함수가 책임을 진다.
// 배열의 요소가 string인지 number인지 이런거에 따라 달라지는 것
_map([1, 2, 3, 4], function(v) {
return v + 10;
});