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

重写数组的扩展方法

作者: 輪徊傷 | 来源:发表于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))
    

    相关文章

      网友评论

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

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