首页>前端教程>JavaScript教程

用原型重写数组迭代方法(下)

继续把数组后面迭代的方法用原型写出来……

1、forEach

        // forEach(回调函数)
        // 功能:就是遍历数组的每一项,并且每一项都要执行一次回调函数的功能.
        // 不返回值,所以返回函数默认的undefined.
        // 遍历的是数组的快照,如果中途修改或者删除了数组,不会改变遍历的顺序,所以不要修改数组
        Array.prototype.myForEach = function (callback) {
            const arr = this;
            const arg2 = arguments[1] || window;

            if (typeof callback !== 'function') {
                throw new Error('第一个参数必须是函数');
            }
            if (arr.length == 0) return;
            for (let i = 0; i < arr.length; i++) {
                callback.call(arg2, arr[i], i, arr);
            }
        }

2、map

        // map(function(item,index){})
        // 功能:遍历数组的每一项,每一项都要执行回调函数.
        // 返回值:返回一个新数组,数组的长度和原数组一样.
        Array.prototype.myMap = function (callback, scope) {
            const arr = this;
            if (typeof callback !== 'function') {
                throw new Error('参数1必须是一个函数');
            }
            let result = [];
            if (arr.length == 0) return result;
            scope = scope || window;
            for (let i = 0; i < arr.length; i++) {
                result.push(callback.call(scope, arr[i], i, arr));
            }
            return result;
        }

3、filter

        // filter(function(item,index){})
        // 功能:对数组的每一项进行筛选,每一项都要执行回调函数,通过函数筛选成功的值,返回到新数组中.
        // 返回一个新数组,数组的长度可能比原数组要小.
        Array.prototype.myFilter = function (callback, scope) {
            const arr = this;
            if (typeof callback !== 'function') {
                throw new Error('参数1必须是一个函数');
            }
            let len = arr.length;
            let result = [];
            if (len == 0) return result;
            scope = scope || window;
            for (let i = 0; i < len; i++) {
                if (callback.call(scope, arr[i], i, arr)) {
                    result.push(arr[i]);
                }
            }
            return result;
        }

4、every

        // every(function(item,index){})
        // 功能:每一项都要执行回调函数,通过了函数的条件,每一项都为true,才返回 true,如果有一项为假,则返回false
        // 返回值:布尔值
        Array.prototype.myEvery = function (callback, scope) {
            const arr = this;
            if (typeof callback !== 'function') {
                throw new Error('参数1必须是一个函数');
            }
            let len = arr.length;
            if (len == 0) return true;
            scope = scope || window;
            for (let i = 0; i < len; i++) {
                // 如果有一个不满足,返回false
                if (!callback.call(scope, arr[i], i, arr)) {
                    return false;
                }
            }
            return true;
        }

5、some

        // some(function(item,index){})
        // 功能:数组的某一项通过了函数的条件判断,则返回true,如果都没有通过,才返回false
        // 返回值:布尔值
        Array.prototype.mySome = function (callback, scope) {
            const arr = this;
            if (typeof callback !== 'function') {
                throw new Error('参数1必须是一个函数');
            }
            let len = arr.length;
            if (len == 0) return false;
            scope = scope || window;
            for (let i = 0; i < len; i++) {
                // 如果有一个满足,返回true
                if (callback.call(scope, arr[i], i, arr)) {
                    return true;
                }
            }
            return false;
        }

6、reduce

         // reduce(function(sum,i){},0)
        // 功能:累计
        Array.prototype.myReduce = function (callback, init) {
            const arr = this;
            if (typeof callback !== 'function') {
                throw new Error('参数1必须是一个函数');
            }
            let len = arr.length;
            // 如果长度为0,又没有设置初始值,报错
            if (len == 0 && init === undefined) {
                throw new Error('数组为空时必须设置初始值');
            }
            // 如果长度为0,返回初始值
            if (len == 0) return init;
            // 总的值默认为初始值,没有初始值,默认为0
            let total = init || 0;
            // 没有设置初始值的时候,total默认为第一个数组的值,选项从第二个开始遍历。
            if (init === undefined) {
                total = arr[0];
                for (let i = 1; i < len; i++) {
                    total = callback(total, arr[i], i, arr)
                }
            } else {
                // 设置了初始值,则从第一个项开始遍历
                for (let i = 0; i < len; i++) {
                    total = callback(total, arr[i], i, arr)
                }
            }
            return total;
        }

还有includes、find、findIndex等等新增的方法就不写了,差别不大,好吧,其实是我想偷懒了,累觉不爱……

点赞


1
保存到:

相关文章

发表评论:

◎请发表你卖萌撒娇或一针见血的评论,严禁小广告。

Top