美文网首页
重写数组的扩展方法

重写数组的扩展方法

作者: 輪徊傷 | 来源:发表于2021-11-19 16:37 被阅读0次

1、forEach:遍历数组

 let data = [1,2,3,4,5,6,7]
//用法
    data.forEach(function(res,index,arr){
        // forEach 的 this 指向forEach 的第二个参数  {name: "aaaaaa"},没有第二个参数的话,this指向window
        console.log(this)
        // console.log(res,index,arr)
    },{name: "aaaaaa"})

//重写
    Array.prototype.myForEach = function(fn) {
        //数组调用,this指向数组本身,通过this获取数组
        let arr = this 
        let len = arr.length
        //forEach方法有两个参数,第一个参数是函数,第二个参数是myForEach方法的this指向,没有第二个参数的话,this指向window
        //例如:myForEach 的 this 指向  {name: "aaaaaa"}
        let arg1 = arguments[1] || window  

        for(let i = 0;i<len;i++){
            fn.apply(arg1,[arr[i],i,arr])
        }
    }
  var fn = function (elem,index,arr){
        console.log(this)
    }
    data.myForEach(fn,{name: "aaaaaa"})

2、filter:过滤 用来筛选符合条件的元素。

    let data = [1,2,3,4,5,3,4,3]
    //  用法
   let newArr = data.filter(function(elem,index,arr) {
        console.log(this)
        return elem == 4
    },{name: "aaaaaa"})
    console.log(newArr)
    //重写
    Array.prototype.myFilter = function(fn){
        let arr = this;
        let len = arr.length;
        let arg1 = arguments[1] || window
        let newArr = [] //注意这里push进来的是应用类型的下标

        for(let i = 0;i<len;i++){
            fn.apply(arg1,[arr[i],i,arr])?newArr.push(temp):""
        }
        return newArr
    }
    var fn = function(elem,index,arr){
        return elem == 3
    }
    let newArr = data.myFilter(fn)
    console.log(newArr)

3、map 映射

            { name: "aaaaaa", price: 23 },
            { name: "aaaaaa", price: 23 },
            { name: "aaaaaa", price: 23 },
        ]
        var tempBook = book.map(function(elem,index,arr){
            elem.name = "123"+elem.name //map里面修改了数组里面的数据,原数组也会产生影响
            return elem
        })

        Array.prototype.myMap = function(fn){
            let arr = this;
            let len = arr.length;
            let arg1 = arguments[1] || window
            let newArr = []
            let temp;

            for(let i = 0;i<len;i++){
                temp = deepClone(arr[i])//防止改变原数组
                newArr.push(fn.apply(arg1,[temp,i,arr]))
            }
            return newArr
        }
        function fn(elem,index,arr){
            elem.name = "123"+elem.name 
            return elem
        }
        var tempBook = book.myMap(fn)
    // 深拷贝======for...in循环对象的所有枚举属性,然后再使用hasOwnProperty()方法来忽略继承属性。
    function deepClone(data){
        const tempData = data.constructor === Array ? []:{}// 第一步复制的目标是数组还是对象
        for(let keys in data){ // 遍历目标
            // console.log('aaaa')
            if(data.hasOwnProperty(keys)){    //Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性。
                // console.log('bbbbbbb')
                if(data[keys] && typeof data[keys] === "object"){
                    tempData[keys] = data[keys].constructor === Array ? []:{}
                    tempData[keys] = deepClone(data[keys])
                }else{
                    tempData[keys] = data[keys]
                }
            }
        }
        return tempData
    }

4、every : 有一个条件(不满足)就停止遍历 some : 有一个条件(满足)就停止遍历

   // every() some()
        var people = [
            { name: 'aaa', age: 11 },
            { name: 'aaa', age: 12 },
            { name: 'aaa', age: 13 },
        ]
//用法
        //如果有一个条件(不满足)就停止遍历,return后面的表达式就是条件
        var res = people.every(function(elem,index,arr){
            console.log(elem.age)
            return elem.age == 13
        })

//重写
        //如果有一个条件(满足)就停止遍历,return后面的表达式就是条件
        var res = people.some(function(elem,index,arr){
            console.log(elem.age)
            return elem.age == 12
        })
        Array.prototype.myEvery = function(fn){
            let arr = this;
            let len = arr.length;
            let arg1 = arguments[1]
            let res = true

            for(let i = 0 ; i < len ; i++){
                res = fn.apply(arg1,[arr[i],i,arr])
                if(!res){
                    break
                }
            }
            return res
        }
        function fn(elem,index,arr){
            return elem.age == 13
        }
        console.log(people.myEvery(fn))

5、reduce() 归纳函数

        let sum = [1,2,3,4,5,6,7,8,9]
//用法
        let total = sum.reduce((total,item) => {
            return total+item
        })
            console.log(total); // 45
//重写
        Array.prototype.myReduce = function(fn,initalValue){
            var arr = this;
            var len = arr.length;
            var arg2 = arguments[2] || window
            for(let i = 0; i < len; i++){
                initalValue = fn.apply(arg2,[initalValue,arr[i],arr])
            }
            return initalValue
        }
        function fn(init,elm,index,arr){
            return init + elm
        }
        console.log(sum.myReduce(fn,0))

相关文章

  • 重写数组的扩展方法

    1、forEach:遍历数组 2、filter:过滤 用来筛选符合条件的元素。 3、map 映射 4、every...

  • vue中是如何检测数组变化的

    个人理解:.使用函数劫持的方式,重写了数组的方法.Vue将data中的数组,进行了原型链重写,指向了自己定义的数组...

  • java系列6:多态(Polymorphism)

    解决了程序的扩展问题。 一、方法覆盖(方法重写) 1、方法覆盖(方法重写) 在类的继承体系结构中,如果子类中出现了...

  • 面向对象 -- (多态,接口,抽象类、方法)

    1.继承并不只是扩展父类的功能,还可以重写父类的成员方法,重写(覆盖)就是在子类中将父类的方法名保留,重写成员方法...

  • ES6的一些笔记(四)

    数组Array类型 数组扩展的方法之类方法 from(array): from(array)可以将伪数组以及带有S...

  • 数组面试题

    1、如何判断数组是数组类型? Array.isArray() 最靠谱的判断数组的方法在调用这个方法之前重写了Obj...

  • Javascript基础进阶(十三)在内置类上扩展方法

    基于内置类的原型扩展方法 基于内置类的原型扩展方法以数组去重为例:

  • extesion注意点

    1.extesion 中不能有属性2.extesion中不能重写父类方法 , 因为重写父类方法是子类的职责,扩展是...

  • 重写数组的方法(改变原数组)

    下图是我自我学习模拟数组时总结的一些重新数组的方法: 本文我们暂不讨论不改变原数组的方法,只谈改变原数组用到的 6...

  • ES6扩展

    字符串扩展 正则扩展 数值扩展 函数扩展 对象扩展 数组扩展 字符串扩展 模版字符串 部分新的方法 padStar...

网友评论

      本文标题:重写数组的扩展方法

      本文链接:https://www.haomeiwen.com/subject/shdgyktx.html