data
<script>
var users = [
{ name: "a", age:14 },
{ name: "b", age:31 },
{ name: "c", age:30 },
{ name: "d", age:35 },
{ name: "e", age:38 },
{ name: "f", age:40 },
{ name: "g", age:39 },
{ name: "h", age:41 },
{ name: "i", age:58 },
{ name: "j", age:48 },
{ name: "k", age:49 }
];
</script>
rest
<script>
function _rest(list, start) {
var ret = [];
start = start || 0
_each(list, function (item, index, list) {
if (index >= start) {
ret.push(item);
}
})
return ret;
}
</script>
each
<script>
function _each(list, func) {
for (var i = 0, endi = list.length; i < endi; ++i) {
func(list[i], i, list);
}
}
</script>
filter
<script>
function _filter(list, func) {
var ret = [];
_each(list, function (item, index, list) {
if (func(item, index, list)) {
ret.push(item)
}
})
return ret;
}
</script>
map
<script>
function _map(list, func) {
var ret = [];
_each(list, function (item, index, list) {
ret.push(func(item, index, list));
})
return ret;
}
</script>
reduce
<script>
function _reduce(list, iter, memo) {
if (arguments.length === 2) {
list = _rest(list, 1);
memo = list[0];
}
_each(list, function (value) {
memo = iter(memo, value);
});
return memo;
}
</script>
pipe
- reduce의 응용
- 인자로 함수를 받고, 이 함수들을 순차적으로 연산한다.
<script>
function _pipe() {
var funcs = arguments;
return function (arg) {
return _reduce(funcs, function (arg, func) {
return func(arg);
}, arg)
}
}
var f1 = _pipe(
function (a) { return a + 1 },
function (a) { return a * 2 },
function (a) { return a * a }
);
console.log(f1(1));
</script>
go
- 첫번째 인자값을 받고, 두번째부터 함수를 받아 순차적으로 연산한다.
<script>
function _go(args) {
var funcs = _rest(arguments, 1);
return _pipe.apply(null, funcs)(args);
}
var f2 = _go(
1,
function (a) { return a * 2 },
function (a) { return a * a }
);
console.log(f2);
_go(
users,
function (users) {
return _filter(users, function (user) {
return user.age < 40;
});
},
function (users) {
return _map(users, function (user) {
return user.name;
});
},
console.log
)
</script>