原生JavaScript进阶训练---重写map方法

news/2024/7/10 23:45:26 标签: js, es6, 前端

码字不易,有帮助的同学希望能关注一下我的微信公众号:Code程序人生,感谢!代码自用自取。

在这里插入图片描述

之前发过一期重写forEach方法的文章,然后更新了多期Electron的内容,现在Electron的内容暂时更新完了,我们继续重写JavaScript的内置方法。

今天重写数组的扩展方法map

先看一下map的基础用法:

var arr = [
            {
                name:'张三',
                age:34
            },
            {
                name:'李四',
                age:25
            },
            {
                name:'王五',
                age:21
            },
            {
                name:'刘六',
                age:28
            }
];

var obj = {
    name:'Jacky',
    age:3
};

var newArr =  arr.map(function(item,index,array){
    console.log(this);
    item.name = obj.name;
    return item
},obj);   

console.log(newArr);

mapforEach不同的是,map会返回一个新的数组。

map的参数和forEach类似,一个必须要有的回调函数,一个可选的对象。

回调函数的参数,还是itemindexarray,作用和forEach一样。

forEach不同的就是,map可以在回调函数里对每一项数据进行一些处理,然后再返回一个新数组出去。
在这里插入图片描述

看下我上面发的示例,首先我们传入了map的第二个参数obj,然后在回调函数内部,对每一项数据进行了一个处理,把arr每一项的name值改为了objname值,即Jacky,并且把itemreturn回去了。

通过控制台输出我们可以发现,在回调函数内部的this指向的是传入的第二个参数obj。然后返回的新数组newArr的每一项的name值都变成的objname,Jacky。

以上就是原生map方法的使用过程。接下来我们对它进行重写。

Array.prototype.myMap = function(callBack){
    var _arr = this;
    var _len = _arr.length;
    var _arg2 = arguments[1] || window;
    var _newArr = [];
    var _item;
    var _res;

    for(var i = 0; i < _len; i++){
        _item = deepClone(_arr[i]);
        _res = callBack.apply(_arg2,[_item,i,_arr])
        _res && _newArr.push(_res);
    }

    return _newArr;
};

我们在Array对象的原型上新增myMap方法,方法的内部其实都是一些比较常规的操作,应该都能知道是在干嘛。
值得一提的是,因为原生的map方法是返回一个新的数组。所以,我们需要对操作的每一项进行push之前,把它深拷贝,即代码中的deepClone方法,这样才能真正做到和原生map一致。

深拷贝deepClone的代码网上有很多,有能力的也可以自己写,我给大家提供一下。

function deepClone(obj){
    let newObj = obj.push?[]:{}; //如果obj有push方法则 定义newObj为数组,否则为对象。
    for(let attr in obj){
        if(typeof obj[attr] === 'object'){
            newObj[attr] = deepClone(obj[attr]);
        }else{
        newObj[attr] = obj[attr];
        }
    }
    return newObj;
}

接下来,我们去试一下,我们写的myMap方法和原生的map方法,有没有区别:

var arr = [
            {
                name:'张三',
                age:34
            },
            {
                name:'李四',
                age:25
            },
            {
                name:'王五',
                age:21
            },
            {
                name:'刘六',
                age:3
            }
];

var obj = {
    name:'Jacky',
    age:3
};

var newArr =  arr.map(function(item,index,array){
    console.log(this);
    console.log(item,index,array)
    item.name = obj.name;
    return item
},obj);   

console.log(newArr);

console.log('--------');

var newArr2 = arr.myMap(function(item,index,array){
    console.log(this);
    console.log(item,index,array);
    item.name = obj.name;
    return item;
},obj);

console.log(newArr2);

在这里插入图片描述

通过控制台的输出我们可以发现,在使用方法相同的情况下,原生的map方法和我们重写的myMap方法,实现的效果一模一样。

这样我们就完成了对JavaScript数组扩展方法map的重写。

PS:有任何问题都可以加我联系方式交流,发现代码的任何问题,欢迎指正,本人也是菜鸡。

原生JavaScript是决定我们前端工作高度的核心,要充分掌握原生JavaScript,才能让你的职业生涯走的更远。


有微信小程序课设、毕设需求联系个人QQ:505417246

关注下面微信公众号,可以领取微信小程序、Vue、TypeScript、前端、uni-app、全栈、Nodejs、Python等实战学习资料
最新最全的前端知识总结和项目源码都会第一时间发布到微信公众号,请大家多多关注,谢谢

在这里插入图片描述


http://www.niftyadmin.cn/n/1576495.html

相关文章

原生JavaScript进阶训练---重写filter方法

码字不易&#xff0c;有帮助的同学希望能关注一下我的微信公众号&#xff1a;Code程序人生&#xff0c;感谢&#xff01;代码自用自取。 这期我们重写的是一个非常常用的数组扩展方法filter。 按照惯例&#xff0c;我们先看一下原生filter的使用 var arr [{name: "张三&…

【网络】 应用传输层笔记

应用层 应用层常用的协议和各自对应的TCP/UDP端口&#xff1a; DNS  TCP/UDP  53 HTTP  TCP  80 SMTP  TCP  25 POP  UDP  110 Telnet  TCP  23 DHCP  UDP  67 FTP  TCP  20和21 关于端口号的分配可以提一下&#xff1a; 公认端口&#xff1a;0-10…

前端数据结构与算法复习日记---前言

码字不易&#xff0c;有帮助的同学希望能关注一下我的微信公众号&#xff1a;Code程序人生&#xff0c;感谢&#xff01;代码自用自取。 数据结构与算法一直是程序员的命脉&#xff0c;对于后端程序员来说&#xff0c;它是必须要熟练的。对于前端程序员&#xff0c;在一些中小型…

前端数据结构与算法复习日记---直接插入排序

码字不易&#xff0c;有帮助的同学希望能关注一下我的微信公众号&#xff1a;Code程序人生&#xff0c;感谢&#xff01;代码自用自取。 直接插入排序是插入类排序算法里比较简单的一个了。 它的核心思路就是&#xff1a; 首先默认数组的第一项元素是最小的&#xff08;升序&…

[linux]Linux入门

Linux操作系统文件系统基础知识详解(转载) blog.chinaunix.net/uid-26449305-id-3023428.html 三大经典 不可不知的Linux发行版本介绍&#xff08;转载&#xff09; blog.chinaunix.net/uid-26449305-id-3027547.html Linux 20 周年庆祝会 51CTO 会场 http://os.51cto.com/exp…

jQuery-过滤选择器一

1、基本过滤选择器 <script type"text/javascript">$(function(){$(div:first).css(background,red); //所有div元素中的第一个div元素$(div:last).css(background,blue); //所有div元素中的最后一个div元素$(div:not(.one)).css(background,green); //所…

原生JavaScript进阶训练---重写call方法

码字不易&#xff0c;有帮助的同学希望能关注一下我的微信公众号&#xff1a;Code程序人生&#xff0c;感谢&#xff01;代码自用自取。 之前的系列中&#xff0c;跟着大家重写了数组常用的一些内置方法&#xff0c;今天给大家重写一下call方法&#xff0c;这个也是面试非常非常…

串口的AT命令

1.设置 DCD 功能模式 DCD 线路只在数据载波存在时打开(当建立GRPRS连接时&#xff0c;DCD输出低电平) AT&C1 2.设置 DTR 功能模式 DTR 由 ON 至 OFF&#xff08;电平从低到高&#xff09;&#xff1a; TA 在保持当前数据通话的同时&#xff0c;切换至命令模式。 AT&D1 …