使用高阶回调参数减少

时间:2014-04-14 11:50:06

标签: javascript callback reduce higher-order-functions

我已经尝试了很多方法来使父参数对reduce的回调函数可见但我必须遗漏一些东西......

// Static
var y = [0, 1, 2, 3, 4, 5, 6, 7].reduce(
    function(arr, x){
        arr.push(Math.pow(2, x));
        return arr},[]);
console.log(y);

// Dynamic
var lambda = function(arr, func) {
    return (function(f) { return arr.reduce(function(a, x) {
        a.push(f(x));
        return a;
    }, [])})(func);
}
var y = lambda([0, 1, 2, 3, 4, 5, 6, 7],function(x){return Math.pow(x);});
console.log(y);

输出:

[1, 2, 4, 8, 16, 32, 64, 128]  
[NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN] 

DEMO @ JSFiddle

2 个答案:

答案 0 :(得分:1)

不要忘记Math.pow中的第一个参数:

// ------------------------------------------------------------v
lambda([0, 1, 2, 3, 4, 5, 6, 7], function(x) { return Math.pow(2, x); });

答案 1 :(得分:1)

您缺少Math.pow的其中一个参数。您可能想要像这样调用lambda

var y = lambda([0, 1, 2, 3, 4, 5, 6, 7], function(x) {
    return Math.pow(2, x);
});

此外,您不必将lambda构造与IIFE复杂化。它可以简单地

var lambda = function(arr, func) {
    return arr.reduce(function(a, x) {
        a.push(func(x));
        return a;
    }, []);
}

修改:正如您在评论中建议的那样,您可以使用Array.prototype.map,就像这样

console.log(arr.map(function(x) {
    return Math.pow(2, x);
}));