JavaScript 之 常用迭代方法forEach、filter()、map()、reduce()

news2025/1/21 18:48:56

JavaScript 之 常用迭代方法forEach、filter、map、reduce

  • 1. for、forEach
    • 1.1 for 遍历的3种写法
    • 1.2 forEach + 回调函数 遍历
    • 1.3 forEach + 箭头函数 遍历
  • 2. filter()
    • 2.1 介绍
    • 2.2 例子1——简单过滤
    • 2.3 例子2——在修改数组时 filter() 方法的行为
    • 2.4 例子3——在数组中搜索
  • 3. map()
    • 3.1 介绍
    • 3.2 例子1——求数组中每个元素的2倍
    • 3.3 例子2——使用 map 重新格式化数组中的对象
  • 4. reduce()
    • 4.1 介绍
    • 4.2 例子1——数组元素求和
    • 4.3 例子2——求对象数组中某属性值的总和
    • 4.4 例子3——展平嵌套数组
    • 4.5 例子4——统计对象中值的出现次数
    • 4.6 例子5——数组去重

1. for、forEach

1.1 for 遍历的3种写法

  • 代码如下:
    var array = [66,77,88];
    
    for(var i =0;i<array.length;i++){
    	console.log(array[i]);
    }
    
    console.log("\n============")
    
    for(var i in array){
    	console.log(array[i]);
    }
    
    console.log("\n============")
    
    for(var item of array){
    	console.log(item);
    }
    
    在这里插入图片描述
    在这里插入图片描述

1.2 forEach + 回调函数 遍历

  • 如下:

    	  var array = [66,77,88];
    
          console.log("\n=====1.1=======\n\n")
    
          array.forEach(function(value){
              console.log(value);
          });
    
          console.log("\n====1.2========\n\n")
    
          array.forEach(function(value,index){
              console.log(`${index}--->${value}`);
          });
    
    
    	  function Dog(name,age){
    		  this.name = name;
    	  	  this.age = age;
    	  }
    	  var d1 = new Dog("麦兜",3);
    	  var d2 = new Dog("贝塔",2);
    	
    	  var dogArray = [d1,d2];
    
          console.log("\n\n\n=====2.1=======\n\n\n")
    
          dogArray.forEach(function(dog){
              console.log(dog);
          })
    
          console.log("\n=====2.2=======\n\n")
    
          dogArray.forEach(function(dog,index){
              console.log(index + '---->' + JSON.stringify(dog));
          })
    

    在这里插入图片描述

1.3 forEach + 箭头函数 遍历

  • 代码简洁很多,如下:

    var array = [66,77,88];
    
    console.log("\n=====1.1=======\n\n")
    
    array.forEach(value=>console.log(value));
    
    console.log("\n====1.2========\n\n")
    
    array.forEach((value,index)=>{
        console.log(`${index}------${value}`);
    })
    
    
    function Dog(name,age){
    	this.name = name;
    	this.age = age;
    }
    var d1 = new Dog("麦兜",3);
    var d2 = new Dog("贝塔",2);
    
    var dogArray = [d1,d2];
    
     console.log("\n\n\n=====2.1=======\n\n\n")
    
     dogArray.forEach(dog=>console.log(dog))
    
     console.log("\n=====2.2=======\n\n")
    
     dogArray.forEach((dog,index)=>console.log(index + '---' + JSON.stringify(dog)))
    

    在这里插入图片描述

2. filter()

2.1 介绍

  • 简介
    filter() 方法创建给定数组一部分的浅拷贝,其包含通过所提供函数实现的测试的所有元素。
  • 语法
    filter(callbackFn)
    filter(callbackFn, thisArg)
    
  • 参数、返回值
    在这里插入图片描述
  • 描述
    在这里插入图片描述
  • 参考官网:
    官网——Array.prototype.filter().

2.2 例子1——简单过滤

  • 代码如下:
    const array = [66,77,88];
    
    //1. 箭头函数回调
    const newArray_1 = array.filter(arr => arr > 70);
    
    //2. 匿名函数回调
    const newArray_2 = array.filter(function(arr){
        return arr > 70;
    });
    
    //3. 普通函数回调
    function myFilter(val){
        if(val > 70){
            return true;
        }else{
            return false;
        }
    }
    const newArray_3 = array.filter(myFilter);
    
    在这里插入图片描述

2.3 例子2——在修改数组时 filter() 方法的行为

  • 代码如下:

    console.log("\n\n====1. 排除第一个元素=====\n\n");
    
     const numArray_1 = [6,7,8];
    
     const new_numArray_1 = numArray_1.filter((item,index,array)=>{
         array[index+1] += 10; //修改的是下一个元素,影响了初始数组,但是数组中第一个数据不动,其余+10
         return item > 10; //除了第一个元素,其余判断时都已经 +10 了
     });
     console.log(numArray_1);//[6, 17, 18, NaN]
     console.log(new_numArray_1);// [17, 18]
    
     console.log("\n\n====2. 所有元素+10 后都判断=====\n\n");
    
     const numArray_2 = [6,7,8];
    
     const new_numArray_2 = numArray_2.filter((item,index,array)=>{
         array[index] += 10;  //从当前元素就改变,即:该变了数组中所有元素
         return array[index] > 10; 
         /**需要注意的是:
          * 这个只是过滤条件,装入新数组的是item,
          * 当前循环时item的值并没有改变(当前下标在数组中的元素值没有改变),
          * 所以装入新数组的是老数据
          */
     });
     console.log(numArray_2);//[16, 17, 18]
     console.log(new_numArray_2);//[6, 7, 8]
    

    在这里插入图片描述

2.4 例子3——在数组中搜索

  • 下例使用 filter() 根据搜索条件来过滤数组内容。
  • 代码如下:
     <script>
         const pets = ['dog-麦兜','dog-泡泡','cat-阿苔','dog-lucky','cat-点点'];
    
         const strs = ['I love you','love?','no','he is hate','love me?'];
    
         function filterIterms(array,query){
             return array.filter(arr => arr.includes(query.toLowerCase()));
         }
    
         let dogs = filterIterms(pets,'dog');
         let cats = filterIterms(pets,'cat');
         let loveStr = filterIterms(strs,'LOve');
    
         console.log(dogs);
         console.log(cats);
         console.log(loveStr);
     </script>
    
    在这里插入图片描述

3. map()

3.1 介绍

  • 简介:
    map() 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。
  • 语法
    map(callbackFn)
    map(callbackFn, thisArg)
    
  • 参数、返回值
    在这里插入图片描述
  • 描述
    在这里插入图片描述

3.2 例子1——求数组中每个元素的2倍

  • 代码如下:

     const numArray = [1,3,5,7];
    
     const new_numArray = numArray.map(num => num*2 );
    
     console.log(numArray);
     console.log(new_numArray);
    

    在这里插入图片描述

3.3 例子2——使用 map 重新格式化数组中的对象

  • 代码如下:

     const kvArray = [
         { key: 1, value: 10 },
         { key: 2, value: 20 },
         { key: 3, value: 30 },
     ];
    
     const reformattedArray = kvArray.map(( {key, value} )=>{
         return ({[key]: value});
     });
    
     console.log(kvArray);
    
     console.log("\n\n======重新格式化数据之后=====\n\n");
     console.log(reformattedArray); // [{ 1: 10 }, { 2: 20 }, { 3: 30 }]
    

    在这里插入图片描述

  • 更多使用请参考官网:
    官网——Array.prototype.map().

4. reduce()

4.1 介绍

  • 使用说明
    • reduce() 方法对数组中的每个元素按序执行一个提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。
    • 第一次执行回调函数时,不存在“上一次的计算结果”。
    • 从第一个元素开始循环还是第二个元素开始循环,取决于有没有传初试值:
      • 如果传初试值:
        回调函数从数组索引为 0 的元素开始执行,汇总结果是:初试值 + 数组中的每个元素
      • 如果没有传初试值:
        数组索引为 0 的元素将被用作初始值,迭代器将从第二个元素开始执行。
  • 语法
    reduce(callbackFn)
    reduce(callbackFn, initialValue)
    
  • 参数 + 返回值
    在这里插入图片描述
    在这里插入图片描述
  • 描述
    在这里插入图片描述

4.2 例子1——数组元素求和

  • 代码如下:

    <script>
        
        const numArray = [1,2,3,4];
    
        /**
         * 没有初试值时:
         * 1. accumulator的值:在第一次调用时,如果没有指定 初始值 则为 数组中的第一个值;
         * 2. 并且 callbackFn 从数组中的第二个值作为 currentValue 开始执行。
         */
        const result_1 = numArray.reduce((accumulator, currentValue)=>{
            console.log(currentValue);
            return accumulator + currentValue;
        });
    
        console.log("结果:" + result_1);//没有初试值:1+2+3+4 = 10
    
    
        console.log("\n\n\n========给初试值的情况======\n\n\n");
    
        /**
         * 有初试值:
         * 1. accumulator的值:在第一次调用时,如果指定了 初始值 则为指定的初始值
         * 2. callbackFn 从数组中的第一个值作为 currentValue 开始执行
         */
        const result_2 = numArray.reduce((accumulator, currentValue)=>{
            console.log(currentValue);
            return accumulator + currentValue;
        },200); //指定初试值:200
    
        console.log("结果:" + result_2);//有初试值:200+1+2+3+4 = 210
    
    </script>
    

    在这里插入图片描述

4.3 例子2——求对象数组中某属性值的总和

  • 代码如下:
        <script>
    
            function Dog(dogName,dogAge){
                this.dogName = dogName,
                this.dogAge = dogAge
            }
    
            let dog_1 = new Dog('麦兜',3);
            let dog_2 = new Dog('泡泡',5);
            let dog_3 = new Dog('大牙',2);
    
            const dogs = [dog_1,dog_2,dog_3];
    
            // console.log(dogs);
            
            const sumAge = dogs.reduce((pre,cur)=>{
                return pre + cur.dogAge;
            },0);
    
            console.log(sumAge);
            
        </script>
    
    在这里插入图片描述

4.4 例子3——展平嵌套数组

  • 如下:

      //展平嵌套数组
      const array = [[1,2],[3,4],[5,6]];
    
      const new_array = array.reduce((accumulator, currentValue)=>{
          return [...accumulator,...currentValue];
      });
    
      console.log(new_array);
    

    在这里插入图片描述

4.5 例子4——统计对象中值的出现次数

  • 如下:

      //统计对象中值的出现次数
    
      const strs = ['you','love','I','love','beautiful','go'];
    
      const count_result = strs.reduce((countSum,currentStr)=>{
          if(currentStr === 'love'){
              return countSum + 1;
          }
          return countSum;
      },0);
    
      console.log("love 单词出现的次数:" + count_result);
    

    在这里插入图片描述

4.6 例子5——数组去重

  • 如下:
     //去重
     const strs = ['you','love','go','love','beautiful','go'];
    
     let result = strs.reduce((countSum,currentStr)=>{
         if(countSum.includes(currentStr)){
             return countSum;
         }else{
             return [...countSum,currentStr];
         }
     },[]);
    
     console.log(strs);
     console.log(result);
    
    在这里插入图片描述
    更多用法,请参考官网:
    官网——Array.prototype.reduce().

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/991093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生成式 AI 中的风险认知

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 直到几年前&#xff0c;你能想象一台机器可以创造艺术、制作故事&#xff0c;甚至理解复杂的数据&#xff0c;如医疗和法律文件吗&#xff1f; 应该不会。对于我们大多数人来说&#xff0c;它仅限于一部看似牵强附会的…

博客系统项目

文章目录 数据库的增删改查草稿箱草稿箱自动保存分页查询后端前端 评论区后端前端 md5加盐加密 md5加盐对用户密码进行加密; 全服用户博客列表页,实现分页查询; 用户博客列表页; 写博客,发博客,改博客; 博客草稿箱,自动保存,定时发布; 博客访问量,博客评论区,博客点赞; 数据库…

MojoTween:使用「Burst、Jobs、Collections、Mathematics」优化实现的Unity顶级「Tween动画引擎」

MojoTween是一个令人惊叹的Tween动画引擎&#xff0c;针对C#和Unity进行了高度优化&#xff0c;使用了Burst、Jobs、Collections、Mathematics等新技术编码。 MojoTween提供了一套完整的解决方案&#xff0c;将Tween动画应用于Unity Objects的各个方面&#xff0c;并可以通过E…

恒运资本:人民币汇率何时走出低谷?

9月7日&#xff0c;国家外汇管理局发布统计数据显现&#xff0c;到2023年8月末&#xff0c;我国外汇储藏规划为31601亿美元&#xff0c;较7月末下降442亿美元&#xff0c;降幅为1.38%。 国家外汇管理局相关负责人表明&#xff0c;2023年8月&#xff0c;受首要经济体微观经济数…

《机器人学一(Robotics(1))》_台大林沛群 第 7 周 【轨迹规划_综合】Quiz 7

题 4-5 存疑&#xff0c;仅供参考&#xff0c;欢迎交流 文章目录 题4-9&#xff1a;题4-5求解代码&#xff1a; Python题6-7求解代码&#xff1a; Python求解 θ4-θ6 时&#xff0c; 记得 将 R 改成相应的&#xff01;&#xff01;&#xff01;&#xff01; 题8-9求解代码&…

深浅拷贝与赋值

数据类型 数据类型 在JavaScript中&#xff0c;数据类型有两大类。一类是基本数据类型&#xff0c;一类是引用数据类型。 基本数据类型有六种&#xff1a;number、string、boolean、null、undefined、symbol。 基本数据类型存放在栈中。存放在栈中的数据具有数据大小确定&a…

2023高教社杯数学建模B题思路代码 - 多波束测线问题

# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c; 在不同界面上产生反射&#xff0c; 利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信 号&#xff0c;并记录从声波发射到…

更换Eclipse的JDK版本

点击window->Preferences 选择Installed JREs 点击 Add 按钮&#xff0c; 选择Standard VM, 点击 Next。然后选择自己安装的JDK路径

测量仪器方案——核辐射检测仪方案

核辐射在我们日常生活中是比较常见的&#xff0c;基本在任何地方都会存在或多或少的辐射放射源&#xff0c;当它的强度超过一定数值后&#xff0c;就会对人体造成一定的影响。如果是在辐射强度过高的领域工作时&#xff0c;建议选择核辐射检测仪作为防护仪器。目前核辐射检测仪…

一点感受

做了两天企业数字化转型的评委&#xff0c;涉及全国最顶级的公司、最顶级的实际落地项目案例&#xff0c;由企业真实的落地团队亲自当面讲解。主要是为了了解了解真实的一线、真实的客户、真实的应用现状和应用水平。 &#xff08;1&#xff09;现状 我评审的涉及底层技术平台&…

无涯教程-JavaScript - HEX2DEC函数

描述 HEX2DEC函数将十六进制数字转换为十进制。 语法 HEX2DEC (number)争论 Argument描述Required/Optionalnumber 您要转换的十六进制数。 数字不能超过10个字符(40位)。数字的最高有效位是符号位。其余的39位是幅度位。 负数使用二进制补码表示。 Required Notes 十六进…

在Spring Boot项目中使用JPA

1.集成Spring Data JPA Spring Boot提供了启动器spring-boot-starter-data-jpa&#xff0c;只需要添加启动器&#xff08;Starters&#xff09;就能实现在项目中使用JPA。下面一步一步演示集成Spring Data JPA所需的配置。 步骤01 添加JPA依赖。 首先创建新的Spring Boot项目…

Git_回退到上一次commit与pull

git 回退到上个版本 rollback 回滚 git reset HEAD&#xff0c; git 回退到上一版本

Codeforces Round 895 (Div. 3) A ~ F

Dashboard - Codeforces Round 895 (Div. 3) - Codeforces A 问多少次能使a 和 b相等&#xff0c;就是abs(a - b) / 2除c向上取整&#xff0c;也就是abs(a - b)除2c向上取整。 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #de…

vue checkbox-group和checkbox动态生成,问题解决

源码 <el-checkbox-group v-model"form[keyItem.name]"><el-checkboxv-for"(checkboxItem,cindex) in keyItem.options.split(,)":key"cindex":label"checkboxItem"></el-checkbox></el-checkbox-group> 我是…

freertos之任务运行时间统计实验

这里写目录标题 任务时间统计函数时间统计API函数使用流程实验 任务时间统计函数 void vTaskGetRunTimeStats(char * pcWriteBuffer); 时间统计API函数使用流程 实验 1.首先现在FreeRTOSConfig.h文件里将configGENERATE_RUN_TIME_STATS 和configUSE_STATS_FORMATTING_FUNCTIO…

scanf和scanf_s函数详解

目录 引言&#xff1a; 1.scanf函数的用法&#xff1a; 2.scanf_s函数的用法&#xff1a; 3.scanf和scanf_s的区别&#xff1a; 结论&#xff1a; 引言&#xff1a; 在C语言中&#xff0c;输入函数scanf是非常常用的函数之一&#xff0c;它可以从标准输入流中读取数据并将其…

在学习编程的过程中,我会记录下以下内容:

在学习编程的过程中&#xff0c;我会记录下以下内容&#xff1a; 常用代码片段&#xff1a;我会记录一些常用的代码片段&#xff0c;例如文件读写、列表操作、字符串处理等。这些代码片段可以在日常编程中快速复用&#xff0c;提高编码效率。 # 文件读取 with open(file.txt,…

手术麻醉信息系统源码 医院麻醉监护的功能覆盖整个手术与麻醉的全过程

手术麻醉信息系统源码 PHP手麻系统源码 手术麻醉信息系统是HIS产品的中的一个组成部分&#xff0c;主要应用于医院的麻醉科&#xff0c;属于电子病历类产品。医院麻醉监护的功能覆盖整个手术与麻醉的全过程&#xff0c;包括手术申请与排班、审批、安排、术前、术中和术后。 手…

0908集合总结

Java集合 Java的集合类主要由Collection接口和Map接口派生而来&#xff0c;其中Collection接口由两个常用的子接口&#xff0c;即List接口和Set接口&#xff0c;所以常说的Java集合框架由三大类接口构成&#xff08;Map接口、List接口和Set接口&#xff09; List接口 List的…