数组迭代方法实现原理

filter 方法

对数组每一项运行给定函数,返回数组中函数运行返回 true 时的结果

  • 示例
let arr = [1, 2, 3, 4, 5];
let fitered = arr.filter(item => item > 3);
console.log(fitered); // [4, 5]
  • 实现
        Array.prototype.filter = function (fn) {
            let newArr = [];
            for (let i = 0, len = this.length; i < len; i++) {
                fn(this[i]) && newArr.push(this[i]);
            }
            return newArr;
        }

        console.log(arr.filter(item => item > 3)) // [4, 5]

map 方法

对数组中的每一项运行给定的函数,返回每次函数调用结果组成的数组

  • 示例
        let arr = [1, 2, 3, 4, 5];
        let maped = arr.map(item => item*2);
        console.log(maped) // [2, 4, 6, 8, 10]
  • 实现
        Array.prototype.map = function (fn) {
            let newArr = [];
            for (let i = 0, len = this.length; i < len; i++) {
                newArr.push(fn(this[i]));
            }
            return newArr;
        }
        console.log(arr.map(item => item + 1)); // [2, 3, 4, 5, 6]

forEach 方法

无返回值

  • 实现
        Array.prototype.forEach = function (fn) {
            for (let i = 0, len = this.length; i < len; i++) {
                fn(this[i]);
            }
        }

some 方法

对数组的每一项运行给定函数,只要有一项使得函数返回 true 则方法返回 true ,后续元素不再检测

  • 实现
        Array.prototype.some = function (fn) {
            for (let i = 0, len = this.length; i < len; i++) {
                if (fn(this[i])) {
                    return true;
                }
            }
            return false;
        }

every 方法

对数组每一项运行给定函数,只有每一项都使得函数返回 true 则方法返回 true

  • 实现
        Array.prototype.every = function (fn) {
            for (let i = 0, len = this.length; i < len; i++) {
                if (!fn(this[i])) {
                    return false;
                }
            }
            return true;
        }

归并方法 reduce

迭代数组所有项,对每一项运行给定函数,该函数接收四个参数(前一个值,当前值,项的索引,数组对象),函数返回的值将作为第一个参数传给下一项

  • 示例
        let arr = [1, 2, 3, 4, 5];
        let sum = arr.reduce(function(pre, cur, index, arr) {
            return pre + cur;
        });
        console.log(sum); // 15
  • 实现
        Array.prototype.reduce = function (reducer, initVal = this[0] || 0) {
            for (let i = 1, len = this.length; i < len; i++) {
                initVal = reducer(initVal, this[i], i, this);
            }
            return initVal;
        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容