javascript - 化简函数采用未定义的初始值

标签 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

如果初始未定义:

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,则意味着未给出 initial。因此,我们将 result 设置为 array[0] 并递增 index。如果array为空,那么我们会抛出一个错误。否则,我们将结果设置为传递给函数的初始值。其他一切正常。

注解1:我们不修改initial(即写initial = array[index++])的原因是因为如果我们使用函数中的参数并修改函数的参数,则函数将 not be optimized在V8中。因此,它的执行速度会变慢。

希望这有帮助。

关于javascript - 化简函数采用未定义的初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28654202/

相关文章:

javascript - 响应式(Reactive)表达式中的热可观察序列是由什么开始的

javascript - 显示导航菜单水平镶边问题

python - 我正在写一个函数来查找数字是否是回文。它在第2行给了我一个运行时错误,这是函数定义的行[closed]

python - 如何判断一个数中的连续数字是偶数还是奇数?

javascript - 如何使用 Lodash java 脚本库进行模糊搜索?

javascript - Karma 单元测试 jsonp 回调中的延迟 promise (stripe.js)

javascript - 如何在回调函数中使用express response.send(以mysqljs在nodejs中的使用为例)

javascript - 普通 JavaScript 版本的 jQuery .click

javascript - Lodash - 从对象中删除嵌套属性

javascript - lodash debounce 在匿名函数中不起作用