数组重构-Map

 /* 
            map :  不改变原数组,返回一个新数组,新数组的长度与云数组长度相等
            于forEach相比,就是放回一个新数组,是一个用来记录回调函数对原数组的操作后的映射数组
        */
        let arrMap = [{a:2},2,3 ,4,5,6,7,8,{a:1}]
        function arrayMap(arr , func){
            if(!arr || arr.constructor !== Array)  throw new TypeError(arr + 'is not an Array')
            if(!func || typeof func !== 'functio') throw new TypeError(func + 'is not a functio')
            let newArray = []
            for(let i =0; i< arr.length ;i++){
                if(i in arr) newArray[i] = fn(arr[i] , i , arr)
            }
            return newArray
        }

        
        /* 
            Object.assign({} , itm)  对象的复制,第一个元素是定义的新对象,第二个元素开始是要复制的对象
            新旧对象最外层的引用地址是不相同的,但是内层的引用地址相同
        */
        //  数组的复制
        let arr1 = Object.assign([] , arrMap)
        let arr2 = arrMap.slice()
        let arr3 = arrMap.concat()
        // arr1[0].a = 10  // 以上都是浅复制引用类型的元素,任意一个修改其他的也都跟着改

        let arr4 = arrMap.map((itm) => {
            return Object.assign({} , itm)
        })
        arr1[0].a = 10
        console.log(arrMap,arr4,'arr4的值不受影响' , '28' , arr1)

        // map一般涌来对整个数组映射,过滤不太好使
       let arr5= arrMap.map((itm) => {
            if(itm === 3) return itm
        })
        console.log(arr5) //[undefined, undefined, 3, undefined, undefined, undefined, undefined, undefined, undefined]  在map中,对应每次元素执行func操作的时候,不满足的不返回,这样默认返回undefined
        // 返回的新数组的长度一定等于元素组的

你可能感兴趣的:(js,重构)