JavaScript 手写代码 第七期(重写数组方法三) 用于遍历的方法

这篇具有很好参考价值的文章主要介绍了JavaScript 手写代码 第七期(重写数组方法三) 用于遍历的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 为什么要手写代码?

我们在日常开发过程中,往往都是取出来直接用,从来不思考代码的底层实现逻辑,但当我开始研究一些底层的东西的时候,才开始理解了JavaScript每个方法和函数的底层实现思路,我认为这可以很好的提高我们的代码水平和逻辑思维。

2. 手写代码

2.1 forEach

2.1.1 基本使用

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

            let arr = [1, 2, 3];
            arr.forEach((item, index, arr) => {
                console.log(item, index, arr);
            });

JavaScript 手写代码 第七期(重写数组方法三) 用于遍历的方法,JavaScript手写代码,javascript,手写代码,数组方法,前端,开发语言

2.1.2 手写实现

输出结果一致

            Array.prototype.myForEach = function (callback) {
              	if (typeof callback !== 'function') {
                    throw new Error('参数必须是一个函数');
                }
                for (let i = 0; i < this.length; i++) {
                    callback(this[i], i, this);
                }
            };
            arr.myForEach(function (item, index, arr) {
                console.log(item, index, arr);
            });

2.2 map

2.2.1 基本使用

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。

原数组不会发生改变
返回新的数组:在原数组的基础上都加1

            let arr = [1, 2, 3, 4];
            let newArr = arr.map((item, index, arr) => {
                return item + 1;
            });
            console.log(newArr); // [2, 3, 4, 5]
            console.log(arr); // 不会改变原数组 [1, 2, 3, 4]

2.2.2 手写实现

            Array.prototype.myMap = function (callback) {
              	if (typeof callback !== 'function') {
                    throw new Error('参数必须是一个函数');
                }
                // 最终要返回的数组
                let result = [];
                for (let i = 0; i < this.length; i++) {
                    result.push(callback(this[i], i, this));
                }
                return result;
            };
            let newArr = arr.myMap((item, index, arr) => {
                return item + 1;
            });
            console.log(newArr); // [2, 3, 4, 5]
            console.log(arr); // 不会改变原数组 [1, 2, 3, 4]

2.3 filter

2.3.1 基本使用

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
filter() 不会改变原始数组。

返回数组中大于3的项

            let arr = [1, 2, 3, 4, 5];
            let newArr = arr.filter((item, index, arr) => {
                return item > 2;
            });
            console.log(newArr); // [3,4,5]
            console.log(arr); // [1,2,3,4,5]

2.3.2 手写实现

            Array.prototype.myFilter = function (callback) {
              	if (typeof callback !== 'function') {
                    throw new Error('参数必须是一个函数');
                }
                let result = [];
                for (let i = 0; i < this.length; i++) {
                    // 判断是否符合item > 2,符合则push到数组res里面返回
                    callback(this[i], i, this) && result.push(this[i]);
                }
                return result;
            };
            let newArr = arr.myFilter((item, index, arr) => {
                return item > 2;
            });
            console.log(newArr); // [3,4,5]
            console.log(arr); // [1,2,3,4,5]

2.4 every

2.4.1 基本使用

every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
如果所有元素都满足条件,则返回 true

            let arr = [1, 2, 3, 4, 5];
            let flag = arr.every((item, index, arr) => {
                return item > 4;
            });
            console.log(flag); // true

2.4.2 手写实现

            Array.prototype.myEvery = function (callback) {
              	if (typeof callback !== 'function') {
                    throw new Error('参数必须是一个函数');
                }
                for (let i = 0; i < this.length; i++) {
                    if (!callback(this[i], i, this)) {
                        return false;
                    }
                }
                return true;
            };
            let flag = arr.every((item, index, arr) => {
                return item > 4;
            });
            console.log(flag); // false

2.5 some

2.5.1 基本使用

some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
如果没有满足条件的元素,则返回false

2.5.2 手写实现

            Array.prototype.mySome = function (callback) {
                if (typeof callback !== 'function') {
                    throw new Error('参数必须是一个函数');
                }
                for (let i = 0; i < this.length; i++) {
                    if (!callback(this[i], i, this)) {
                        return false;
                    }
                }
                return true;
            };
            let flag = arr.mySome((item, index, arr) => {
                return item > 3;
            });
            console.log(flag);

2.6 reduce

2.6.1 基本使用

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
语法:`

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

第一个参数total:必需。初始值, 或者计算结束后的返回值。
第二个参数currentValue:必需。当前元素
第三个参数currentIndex:可选。当前元素的索引
第四个参数arr:可选。当前元素所属的数组对象。

使用示例,实现数组元素的累加

            let arr = [1, 2, 3, 4];
            let sum = arr.reduce((tol, cur) => {
                return (tol += cur);
            }, 0);
            console.log(sum); // 10

2.6.2 手写实现

            Array.prototype.myReduce = function (callback, InitialValue) {
                if (typeof callback !== 'function') {
                    throw new Error('传入第一个参数必须是函数');
                }
                const array = this;
                // 如果没有传InitaialValue初始值时,初始值默认为数组的第一项即array[0]
                let result = InitialValue || array[0];
                for (let i = 0; i < array.length; i++) {
                    // 如果没有传第二个参数InitialValue初始值,当前数组第一项就不在进入循环
                    if (!InitialValue && i == 0) {
                        continue;
                    }
                    result = callback(result, array[i], i, this);
                }
                return result;
            };
            let result = arr.myReduce((tol, cur, index, arr) => {
                return (tol += cur);
            }, 0);
            console.log(result); // 10

2.7 find

2.7.1 基本使用

find() 方法返回满足条件的数组的第一个元素的值。

            let arr = [1, 2, 3];
            let flag = arr.find((item, index, arr) => {
                return item > 2;
            });
            console.log(flag); // 3

2.7.2 手写实现

            Array.prototype.myFind = function (callback) {
                if (typeof callback !== 'function') {
                    throw new Error('传入的参数必须是函数');
                }
                for (let i = 0; i < this.length; i++) {
                    if (callback(this[i], i, this)) {
                        return this[i];
                    }
                }
                return undefined;
            };
            let flag = arr.myFind((item, index, arr) => {
                return item > 2;
            });
            console.log(flag);

2.8 findIndex

2.8.1 基本使用

findIndex() 方法返回传入一个测试条件(函数)符合条件的数组第一个元素位置。

            let arr = [1, 2, 3, 4];
            let index1 = arr.findIndex((item, index, arr) => {
                return item == 3;
            });
            console.log(index1);

2.8.2 手写代码

            Array.prototype.myFindIndex = function (callback) {
                for (let i = 0; i < this.length; i++) {
                    if (callback(this[i], i, this)) {
                        return i;
                    }
                }
                return -1;
            };

            let index1 = arr.myFindIndex((item, index, arr) => {
                return item == 3;
            });
            console.log(index1);

2.9 flatmap

2.9.1 基本使用

flatMap() 方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。它与 map 连着深度值为 1 的 flat 几乎相同,不改变原数组
使用map遍历时,操作完成后,如果遇到操作完的元素为数组,就进行一层的拍平
flatmap

faltmap(callback,thisArg)

第一个参数callback:可以传入 (item,i,arr) 执行
第二个参数thisArg:为执行callback时的this指向 thisArg

代码示例:文章来源地址https://www.toymoban.com/news/detail-521291.html

            let arr = [1, 2, 3, 4, 5];
            let arr1 = arr.flatMap((item) => [item * 2]);
            console.log(arr1); // [2, 4, 6, 8, 10]
            console.log(arr); // [1, 2, 3, 4, 5] 原数组没有发生改变
            let arr2 = arr.flatMap((item) => [[item * 2]]);
            console.log(arr2); // 只能拍平一层 [[2], [4], [6], [8], [10]];
            console.log(arr); // [1, 2, 3, 4, 5]

2.9.2 手写实现


            Array.prototype.myFlatMap = function (callback, thisArg) {
                let newArr = [];
                for (let i = 0; i < this.length; i++) {
                    let res = callback.call(thisArg, arr[i], i, arr);
                    if (Array.isArray(res)) {
                        newArr.push(...res);
                    } else {
                        newArr.push(res);
                    }
                }
                return newArr;
            };
            let arr1 = arr.flatMap((item) => [item * 2]);
            console.log(arr1); // [2, 4, 6, 8, 10]
            let arr2 = arr.myFlatMap((item) => [[item * 2]]);
            console.log(arr2); // 只能拍平一层 [[2], [4], [6], [8], [10]];
欢迎大家在讨论学习,感谢大家支持

到了这里,关于JavaScript 手写代码 第七期(重写数组方法三) 用于遍历的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JavaScript】面试手写题精讲之数组(中)

    续借上文,这篇文章主要讲的是 数组原型链 相关的考题,有些人可能会纳闷,数组和原型链之间有什么关系呢?我们日常使用的数组 forEach , map 等都是建立在原型链之上的。举个🌰,如我有一个数组 const arr = [1,2,3] 我想要调用 arr.sum 方法对 arr 数组的值进行求和,该如何做

    2024年02月21日
    浏览(38)
  • 蓝桥杯上岸每日N题 第七期(小猫爬山)!!!

    要尽可能减少花费--递归的分支尽可能少--优先考虑放重猫 优先考虑放重猫 ,需要从 大到小排个序 , 一直往下搜索,答案是唯一的。 放得下猫就 继续往该车往下加 放不下就再 另外开一辆放猫 分两个分支去放 开一辆继续放其他猫的为一个分支 开另一辆单独只放一只猫的为

    2024年02月14日
    浏览(70)
  • vue 重写数组的七个方法

    一、为什么要重写数组方法? Vue 为了实现响应式数据绑定,需要能够捕获到数据的变化,以便在数据发生改变时自动更新视图。JavaScript 中的数组是引用类型,所以常规的引用跟踪机制不能捕获数组内部的变化。因为Vue的响应式是通过 Object.defineProperty()实现的,这个api没办法

    2024年02月12日
    浏览(42)
  • LLaMA2可商用|GPT-4变笨|【2023-0723】【第七期】

    傅盛:ChatGPT时代如何创业 - BOTAI - 博客园 Google 已经被OpenAI 超越了吗?| AlphaGo 之父深度访谈 《人民日报》:大模型的竞争,是国家科技战略的竞争 WAIC 2023 | 张俊林:大语言模型带来的交互方式变革 Llama 2宇宙大爆炸!伯克利实测排第8,iPhone本地可跑,一大波应用免费玩,

    2024年02月15日
    浏览(36)
  • 数据库管理-第七十七期 再探分布式(20230523)

    上一次系统探讨分布式数据库还是在第三十六期,经过大半年的“进步”加上中间参加了不少国产数据库的研讨会或者交流,对分布式数据库的理解还是有了些许进步。 最近出现了所谓的“新词”:单机分布式,简言之就是一台服务器运行多个数据库实例,通过spanner框架等

    2024年02月08日
    浏览(46)
  • 面试 React 框架八股文十问十答第七期

    作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)React 废弃了哪些生命周期?为什么? 在React 16.3版本后,React废弃了一些生命周期方法,这是为了简化API、提高可维护性以及引入更

    2024年01月18日
    浏览(44)
  • 面试 Vue 框架八股文十问十答第七期

    作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)Vue template 到 render 的过程 在Vue中,template会被编译成一个 render 函数。整个过程包括以下步骤: 模板编译: Vue通过模板编译器将t

    2024年01月25日
    浏览(48)
  • JavaScript 手写代码 第一期

    我们在日常开发过程中,往往都是取出来直接用,从来不思考代码的底层实现逻辑,但当我开始研究一些底层的东西的时候,才开始理解了JavaScript每个方法和函数的底层实现思路,我认为这可以很好的提高我们的代码水平和逻辑思维。 2.1.1 基本使用 定义 : 静态方法以一个现

    2024年02月10日
    浏览(48)
  • JavaScript 手写代码 第四期

    我们在日常开发过程中,往往都是取出来直接用,从来不思考代码的底层实现逻辑,但当我开始研究一些底层的东西的时候,才开始理解了JavaScript每个方法和函数的底层实现思路,我认为这可以很好的提高我们的代码水平和逻辑思维。 简单来说,就是将多维数组转换为一维

    2024年02月10日
    浏览(57)
  • JavaScript 手写代码 第三期

    我们在日常开发过程中,往往都是取出来直接用,从来不思考代码的底层实现逻辑,但当我开始研究一些底层的东西的时候,才开始理解了JavaScript每个方法和函数的底层实现思路,我认为这可以很好的提高我们的代码水平和逻辑思维。 2.1.1 基本使用 函数柯里化指的是一种将

    2024年02月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包