码迷,mamicode.com
首页 > 编程语言 > 详细

js 数组一些方法实现原理

时间:2021-02-22 12:48:55      阅读:0      评论:0      收藏:0      [点我收藏+]

标签: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 < _len; 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 < _len; 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 < _len; 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 < _len; 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<4
// })
// 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 < _len; 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 < _len; 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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!