js 数组一些方法实现原理

2021-03-01 22:25

阅读:658

标签:ring   targe   nts   ||   属性   lse   this   val   而不是   

   //     let obj = {
    //         a: 12,
    //         arr: [{
    //             b: 12
    //         }, {
    //             c: 13
    //         }]
    //     }
        function deepClone(origin, target) {
            let tar = target || {};
            let str = Object.prototype.toString;
            let arrType = ‘[object Array]‘;
            for (let key in origin) {
                //判断属性是否在自己本身而不是在原型链上面
                if (origin.hasOwnProperty(key)) {
                    if (typeof origin[key] === ‘object‘ && origin[key] != null) {
                        tar[key] = str.call(origin[key])=== arrType ? [] : {};
                        deepClone(origin[key], tar[key])
                    } else {
                        tar[key] = origin[key]
                    }
                }
            }
            return tar
        }
    //     const newObj = deepClone(obj, {})
    //     newObj.a = 14
    //     console.log(newObj);
    //    console.log(obj);
/**
 * 
 * 
 * 实现foreach重写
 * 
 * 
*/
let arr = [
    {
        name:‘zs‘,
        age:10
    },
    {
        name:‘ls‘,
        age:12,
    },
    {
        name:‘wu‘,
        age:19
    }
]

// arr.forEach(function(item,index,ar){
//     console.log(item,index,ar);
// })
// Array.prototype.myForeach = function(cb){
//     //谁调用指向谁
//     var _arr = this;
//     var _len = _arr.length;
//     var _arg2 = arguments[1] || window;
//     for (let i = 0; i 
//     cb.apply(_arg2,[_arr[i],i,_arr])        
//     }
// }
// arr.myForeach(function(item,index,ar){
//     console.log(this);
//     console.log(item,index,ar);
// })
/**
 * 
 * 重写map方法
 * 
*/
// arr.map(function (item,index,arr) {

//     console.log(item,index,arr);
// })
// Array.prototype.myMap = function (cb) {
//     let _arr = this;
//     let _len = _arr.length;
//     let _arg2 = arguments[1] || window;
//     let newArr = [];
//     let _item;
//     for (let i = 0; i 
//         _item = deepClone(_arr[i])
//         newArr.push(cb.apply(_arg2,[_item,i,_arr])) 
//     }
//     return newArr
// }
// arr.myMap(function (item,index,arr) {
//     console.log(item,index,arr);
// })
// Array.prototype.myFilter = function (cb) {
//         //保存数组
//         let _this = this;
//         let _len = _this.length;
//         let _arg2 = arguments[1] || window;
//         let _newArr = [];
//         let _item;
//         for (let i = 0; i 
//             _item = deepClone(_this[i])
//             cb.apply(_arg2,[_item,i,_this])?_newArr.push(_item) : ""
//         }
//         return _newArr;
// }
// let newarr = arr.filter(function (item,index) {
//     return false
// })
// let myfilr = arr.myFilter(function (item,index) {
//     return true
// })
// console.log(newarr);
// console.log(myfilr);

/**
 * 
 * every 重写
 * 
 * 
 * 
*/
// arr.every(function (item,index,array) {
//     console.log(item,index,array);
// })

// Array.prototype.myeve = function (cb) {
//         let _arr = this;
//         let _len = _arr.length;
//         let _arg2 = arguments[1] || window;
//         let _flag = true;
//         for (let i = 0; i 
//           let fl =  cb(_arg2,[_arr[i],i,_arr])
//           if (!fl) {
//               _flag = false;
//               break;
//           }
            
//         }
//         return _flag;
// }
// let rel = arr.myeve(function (item,index,array) {
//     return item.age
// })
// console.log(rel);


/**
 * 重写some
 * 
*/

// let a = arr.some(function (item,index) {
//     console.log(item,index);
//     return item.age == 18
// })
// console.log(a);

// Array.prototype.mysome = function (cb) {
//     let _arr = this;
//     let _len = _arr.length;
//     let _arg2 = arguments[2] || window;
//     let _flag = false;
//     for (let i = 0; i 
//         let fl = cb.apply(_arg2,[_arr[i],i,_arr])        
//         if (fl) {
//             _flag = true;
//             break;
//         }
//     }
// return _flag
// }

/**
 * 重写reduce
 * 
 * 
*/
let redarr = []
let newArr = arr.reduce(function (prev,item,index,array) {
    //也可以使用reduce做筛选
    item.age>10 && prev.push(item)
    return prev
},redarr)
    console.log(newArr);
    Array.prototype.myReduce = function (cb,initvalue) {
           let _arr = this;
           let _len = _arr.length;
           let _argu3 = arguments[2] || window;
           let _item;
           for (let i = 0; i ) {
            _item = deepClone(_arr[i])
            initvalue = cb.apply(_argu3,[initvalue,_item,i,_arr])               
           }
           return initvalue
    }

 

js 数组一些方法实现原理

标签:ring   targe   nts   ||   属性   lse   this   val   而不是   

原文地址:https://www.cnblogs.com/ll-11/p/14426851.html


评论


亲,登录后才可以留言!