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>
    // each
    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>
    // reduce
    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)
        }
    }
    // use
    var f1 = _pipe(
        function (a) { return a + 1 }, // 1 + 1
        function (a) { return a * 2 }, // 2 * 2
        function (a) { return a * a } // 4 * 4
    );
    console.log(f1(1)); // 16
</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 }, // 1 * 2
        function (a) { return a * a } // 2 * 2
    );
    console.log(f2); // 4

    // 응용  - 40대 미만 이름
    _go(
        // 초기 데이터
        users,
        // 40대 비만 필터
        function (users) {
            return _filter(users, function (user) {
                return user.age < 40;
            });
        },
        // 필터된 users의 이름만 
        function (users) {
            return _map(users, function (user) {
                return user.name;
            });
        },
        // 나이, 이름 필터결과 출력
        console.log
    )
</script>