减少函数以获取未定义的初始值

时间:2015-02-22 03:33:57

标签: javascript function lodash

我想创建一个执行以下操作的函数(reduce):

其中:

var collection = [1, 2, 3];

function iterator(total, element) {
    return total + element;
};

如果initial定义为3

reduce(collection, iterator, 3)

会这样做:

3 + 1
4 + 2
6 + 3 = 9

如果initialundefined

reduce(collection, iterator)

会这样做:

1 + 2
3 + 3 = 6

这是我的代码:

var reduce = function(collection, iterator, initial) {
    if (initial === undefined) {
        var total = 0;
    } else {
        var total = initial;
    }
    each(collection, function(element) {
        total = iterator(total, element);
    });
    return total;
}

它可以工作,但你可以看到我已经硬编码total = 0,但我希望这个代码在其他场景中工作(例如,乘法,我不希望0来制作整个产品0)。

1 个答案:

答案 0 :(得分:0)

这是我实现它的方式:



alert(reduce([1,2,3], add, 3)); // 9
alert(reduce([1,2,3], add));    // 6

function add(a, b) {
    return a + b;
}

function reduce(array, iterator, initial) {
    var length = array.length;
    var index  = 0;

    if (arguments.length < 3) {
        if (length > 0) var result = array[index++]; // Note 1
        else throw new Error("Reduce of empty array with no initial value");
    } else var result = initial;

    while (index < length) result = iterator(result, array[index++]);

    return result;
}
&#13;
&#13;
&#13;

代码非常自我解释。然而,这里是如何工作的,如果传递的参数数量小于3,则意味着没有给出initial。因此,我们将result设置为array[0]并增加index。如果array为空,那么我们会抛出错误。否则,我们将result设置为传递给函数的initial值。其他一切正常。

注1:我们不修改initial(即写initial = array[index++])的原因是因为我们在函数中使用arguments并且还修改了函数的参数,然后函数将在V8中not be optimized。因此,它会执行得更慢。

希望这有帮助。