链式阵列创建者

时间:2014-12-03 02:23:51

标签: javascript arrays functional-programming

为了好玩,我正在寻找一种创建函数array的方法,具有以下行为:

array()       // []
array(2)      // ugly function thing
array(2)()    // [2]
array(2)(3)() // [2,3] etc

我最接近的是

function array(x) {
    if (x == null)
        return []
    return function() {
        // same as above?!
        // I don't want some inelegant solution involving a lot of additional parameters
    }
}

有没有办法在ECMA5中执行此操作?如果没有,请证明语法不能适应这样的功能。

2 个答案:

答案 0 :(得分:2)

是," 与上述相同"。这可以通过"递归" 1 调用来解决:

function makeArrayAppender(arr) {
    return function array() {
        var args = Array.prototype.slice.call(arguments);
        if (!args.length)
            return arr;
        else
            return makeArrayAppender(arr.concat(args));
    };
}
var array = makeArrayAppender([]);

1:从返回的" thunk"中调用该函数。功能,而不是来自呼叫本身,它不是真正的递归。它更像是一个尾调用优化函数,可以在不填充堆栈的情况下手动调用

答案 1 :(得分:-1)

我认为这应该完全符合您的要求。自执行函数的范围是rrr,它们基本上是使用此实现的静态变量。当然,您需要在将r分配给rr后重置ra,这样您就可以在undefined具有var array = (function(){ var r = [], rr; function ra(a){ if(a === undefined){ rr = r; r = [] return rr; } else{ r.push(a); return ra; } } return ra; })(); console.log(array()); console.log(array(5)()); console.log(array()); console.log(array(7)(2)()); 参数时返回数组,然后停止递归行为。

{{1}}