javascript - 原生数组Reduce实现问题

标签 javascript arrays

我试图实现 native reduce:

Array.prototype.myReduce = function(callback, initialVal) {
    var accumulator = (initialVal === undefined) ? undefined : initialVal;
    for (var i = 0; i < this.length; i++) {
        if (accumulator !== undefined)
            accumulator = callback.call(undefined, accumulator, this[i], i, this);
        else
            accumulator = this[i];
    }
    return accumulator;
};

大多数测试运行良好,但是当我尝试运行它时它失败了:

原始缩减:

[1,2,3,4,5].reduce((carry, val, i, arr) => { console.log('arr', arr); arr[arr.length] = val; return carry;  }, []);

// Iterated 5 times
arr (5) [1, 2, 3, 4, 5]
arr (6) [1, 2, 3, 4, 5, 1]
arr (7) [1, 2, 3, 4, 5, 1, 2]
arr (8) [1, 2, 3, 4, 5, 1, 2, 3]
arr (9) [1, 2, 3, 4, 5, 1, 2, 3, 4]

Myreduce:

[1,2,3,4,5].myReduce((carry, val, i, arr) => { console.log('arr', arr); arr[arr.length] = val; return carry;  }, []);

// Infinite recursion, since we are pushing every time
arr (5) [1, 2, 3, 4, 5]
arr (6) [1, 2, 3, 4, 5, 1]
arr (7) [1, 2, 3, 4, 5, 1, 2]
arr (8) [1, 2, 3, 4, 5, 1, 2, 3]
arr (9) [1, 2, 3, 4, 5, 1, 2, 3, 4]
arr (10) [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
arr (11) [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]

有人可以告诉我哪里出错了吗?

最佳答案

您改变了原始数组,因此永远不会达到 this.length

您应该将原始数组的长度存储在某处并使用它。

例如:

Array.prototype.myReduce = function(callback, initialVal) {
    var accumulator = (initialVal === undefined) ? undefined : initialVal;
    var len = this.length;

    for (var i = 0; i < len; i++) {
        if (accumulator !== undefined)
            accumulator = callback.call(undefined, accumulator, this[i], i, this);
        else
            accumulator = this[i];
    }
    return accumulator;
};

关于javascript - 原生数组Reduce实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49018769/

相关文章:

javascript - 使用范围 slider 和 JavaScript 更改 DiV 元素的宽度

javascript - 合并 json 并构建具有重复项的 csv

在 C 中检查用户输入

arrays - 数组搜索的伪代码

c - 在C中将char添加到char数组中

php - 获取具有某个键值的所有值

javascript - 遍历我的主目录时出现 EPERM 错误的原因是什么?

Javascript:从数组中删除特定项目并返回没有这些项目的原始数组

javascript - 从 mongodb 作为文档检索对象类型后如何获取对象类型?

c++ - 使用比较运算符比较数组