javascript-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

如果未定义initial:

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).

解决方法:

这就是我要实现的方式:

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;
}

该代码很容易解释.不过,这是它的工作原理,如果传递的参数数少于3,则表示未给出初始值.因此,我们将结果设置为array [0]和增量索引.如果数组为空,则抛出错误.否则,我们将结果设置为传递给函数的初始值.其他一切正常.

注意1:我们之所以不修改初始值(即写initial = array [index]),是因为如果我们在函数中使用参数并且还修改了函数的参数,则该函数在V8中将为not be optimized.因此,它将执行得更慢.

希望这可以帮助.

上一篇:Python math.nan 常量


下一篇:JavaScript中的数据类型转换