导航菜单
  • 首页
  • 首页>前端万博manbext备用网址>JavaScript万博manbext备用网址

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

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

    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