本文主要介绍数组常见遍历方法:forEach、map、filter、find、every、some、reduce,它们有个共同点:不会改变原始数组。

接下来都是使用底下的基础数组来实现一些方法:

  • 累加
  • 比大小
  • 分别运算
  • 查找特定值等
let people = [{name: '马云',money: 2000},{name: '马化腾',money: 1800},{name: '李彦宏',money: 1500},{name: '我',money: Infinity}
];
复制代码

forEach:遍历数组

forEach与另外几种方法有些许不同,就是除了forEach以外的几个方法都会返回值,如果在等号的左方放一个变量,那么此变量返回值将会是undefined(没有返回任何值)。

var forEachLoop = people.forEach( function ( item, index, array ) {console .log(item, index, array); //(对象,索引,全部数组)
});
console .log(forEachLoop); // undefined
复制代码

其它的方法都会返回一个值或数组,以此来说就会传回原本的数组值。

var mapLoop = people.map( function ( item, index, array ) {return item
});
console .log(mapLoop); //与原本数组资料相同
复制代码

map:一一映射另一个数组

map会return返回的对象、值,作用上是用来处理数组返回新值产生一个新数组,要特别注意返回的值数量与原始数组长度相同,所以如果不给return,默认返回undefined

// 没有给return 也会产生undefined
var mapEmpty = people.map( function ( item, index, array ) {
});
console .log(mapEmpty);     // [undefined, undefined, undefined, undefined]var everyoneAdd = people.map( function ( item, index, array ) {item.money = item.money + 500 ; //每个money + 500return item;              //返回对象
});
console .log(everyoneAdd);   // 返回每个处理后的数值,不过记得这是传参考特性,会影响到原始的对象
// {name: "马云", money: 2500}
// {name: "马化腾", money: 2300}
// {name: "李彦宏", money: 2000}
// {name: "我", money: Infinity}var mapMoneyThan1500 = people.map( function ( item, index, array ) {// 错误示范,长度不符合时if (item.money > 1500 ) {return item;               //取得大于1500}
});
console .log(mapMoneyThan1500);
// [{name: "马云", money: 2000}, {name: "马化腾", money: 1800}, undefined, {name: "我", money: Infinity} ]
复制代码

filter:过滤掉数组中符合条件的元素

filter() 检测数值元素,并返回符合条件所有元素的数组。 filter() 不会改变原始数组。

// filter
var filterEmpty = people.filter(function(item, index, array){
});
console.log(filterEmpty);    // 没有给条件,会是一个空数组var filterMoneyThan1500 = people.filter(function(item, index, array){return item.money > 1500;       // 取得大于1500
});
console.log(filterMoneyThan1500); // 马云,马化腾,我 这三个对象
复制代码

find:返回符合条件的数组的第一个元素的值

find是用来查找数组中符合条件的对象,且仅能有一个,当返回的true数量超过两个以上时,那会以第一个为优先,通常会用来查找特定 id。如果没有符合条件的对象,则返回undefined

var findEmpty = people.find(function(item, index, array){
});
console.log(findEmpty);          // 没有条件,会是 undefinedvar findMoneyThan1500 = people.find(function(item, index, array){return item.money > 1500;      // 取得大于1500
});
console.log(findMoneyThan1500);  // 虽然满足条件的有3个,但只会返回 '马云' 这一个对象var findMe = people.find(function(item, index, array){return item.name === '我';    // 找到我
});
console.log(findMe);            // 我 这一对象
复制代码

every:验证数组中是否每个元素都满足指定的条件

验证全部的结果,当全部的值都为 true 时,则最终会得到 true;只要其中之一为 false,则返回 false

var ans = people.every(function(item, index, array){return item.money > 1800;
});
console.log(ans); // false: 只要有部分不符合,则为 falsevar ans2 = people.every(function(item, index, array){return item.money > 500;
});
console.log(ans2); // true: 大家钱都超过 500
复制代码

some:验证数组中是否有元素满足指定的条件

与前者类似,但只要部分为 true,则返回 true;全部为 false 时返回值才会为 false

var ans = people.some(function(item, index, array){return item.money > 1800;
});
console.log(ans); // true: 只要有部分符合,则为 truevar ans2 = people.some(function(item, index, array){return item.money < 500;
});
console.log(ans2); // false: 大家钱都不少于 500
复制代码

reduce:将数组合成一个值

reduce是其中最为特殊的,首先他返回的参数与之前的不同,它会接收到前一个返回的值供下一个对象使用,很适合用在累加与对比上,返回的可以是数字也可以是数组。

  • accumulator: 前一个参数,如果是第一个数组的话,值是以另外传入或初始化的值
  • currentValue: 当前值
  • currentIndex: 当前索引
  • array: 全部数组
var reduceEmpty = people.reduce(function(accumulator, currentValue, currentIndex, array){
});
console.log(reduceEmpty);                 // 沒有条件,会是 undefined
复制代码

可以通过与前一个相加的方式,累加数组中所有的值。

people.pop(); // 我的钱深不可测,先移除掉
var reducePlus = people.reduce(function(accumulator, currentValue, currentIndex, array){// 分別是前一个返回值, 当前值, 当前索引值console.log(accumulator, currentValue, currentIndex);return accumulator + currentValue.money;  // 与前一个值相加
}, 0);                                      // 传入初始化值为 0
console.log(reducePlus);                    // 总和为 5300
复制代码

也可以相互对比,取出最高的值。

var reduceBestOne = people.reduce(function(accumulator, currentValue, currentIndex, array){console.log('reduce', accumulator, currentValue, currentIndex)return Math.max(accumulator, currentValue.money); // 与前一个值比较哪个更大
}, 0);
console.log(reduceBestOne);                  // 最大值为 2000
复制代码

reduce功能很强大,其余几种遍历方法可以用reduce方法来代替,这里只列出map被reduce代替的例子。

//map方法
var mapMoneyDouble = people.map( function ( item, index, array ) {return item.money*2;               //钱翻倍
});
console .log(mapMoneyDouble); // 4000, 3600, 3000, Infinity//reduce方法实现同样的功能
var reduceMoneyDouble = people.reduce( function ( accumulator, currentValue, currentIndex, array ) {             //钱翻倍accumulator.push(currentValue.money*2);                //钱翻倍return accumulator
},[]);
console .log(reduceMoneyDouble); // 4000, 3600, 3000, Infinity
复制代码

如果觉得文章对你有些许帮助,欢迎在我的GitHub博客点赞和关注,感激不尽!

浅谈数组常见遍历方法相关推荐

  1. 遍历数组的方法和数组的遍历方法(3+10种)(上)

    文章目录 简介 遍历数组的方法 for循环遍历 特点: 使用: 输出: for in遍历 特点: 使用: 输出: 3. for of循环 特点: 使用: 输出: 简介 总所周知,遍历的方法有很多种,有 ...

  2. 学JS的心路历程 -数组常见处理方法

    昨天我们有提到说for-of和forEach可以用来处理数组,但其实还有很多方法可以更快速及精简代码的达到你要的效果. 话不多说,我们赶紧来看吧! Array.prototype.map() 会回传一 ...

  3. 遍历数组的方法和数组的遍历方法(3+10种)(下)

    文章目录 简介 数组的遍历方法 1. forEach() 说明: 使用: 输出: 2. map()映射遍历 说明: 使用: 输出: 3. filter()过滤器遍历 说明: 使用: 输出: 4. so ...

  4. java中virtual关键字_浅谈virtual、abstract方法和静态方法、静态变量理解

    说点对这几个容易混淆的词的理解: 1.c++中的virtual方法的 virtual关键字主要是防止继承中重复继承父类的同一个方法而设置的标识. 2.virtual与abstract关键字的不同之处在 ...

  5. Javascript数组常见的方法

    分为两种:原型(实例)方法和静态函数 第一类:原型方法: 栈方法(后进先出) push 参数:任意个 作用:将任意数量的参数逐个添加到数组尾部 返回值: 新数组的长度 影响:破坏了原数组 pop 参数 ...

  6. JavaScript算法总结 数组 字符串 遍历方法总结

    JavaScript基础算法 一.数组常用方法 1.push() 在尾部追加,类似于压栈,原数组会变. const arr = [1, 2, 3] arr.push(8) console.log(ar ...

  7. 通过挑土豆—我学会了如何区分JS数组的遍历方法

    前言 从最开始学的for循环遍历方法,到后来层出不穷的各种遍历方法,其实最大的区别就是应用场景的不同. 我们最需要记住的就是,什么情况下用哪一种方法比较合适. 从挑土豆开始 这里有一堆土豆,如果换成代 ...

  8. 计算机节约ip,浅谈节约IP地址方法.doc

    浅谈节约IP地址的方法 刘荣欢 (理学院 信计0701 lrhbsym@126.com) 摘 要:随着Internet技术的发展及现代用户计算机的增多,原先以Ipv4标准的IP地址分配以存在严重的空间 ...

  9. 浅谈JVM(六):方法调用过程

    上一篇: 浅谈JVM(一):Class文件解析 浅谈JVM(二):类加载机制 浅谈JVM(三):类加载器和双亲委派 浅谈JVM(四):运行时数据区 浅谈JVM(五):虚拟机栈帧结构 6.方法调用过程 ...

最新文章

  1. IplImage 类型和 CvMat 类型转换为 Mat 类型
  2. Nginx——负载均衡
  3. loguru log 日志的使用
  4. django orm级联_django+jquery 实现级联选择菜单
  5. 树莓派slam_SLAM+语音机器人DIY系列:(五)树莓派3开发环境搭建——6.树莓派USB与tty串口号绑定...
  6. mootools系列:打造属于你自己的Popup(弹出框)——扩展功能篇
  7. Linux 下升级 python2 到python3
  8. flume使用telnet作为入口出现connection refused
  9. python3 console input_Python3 tkinter基础 Button command 单击按钮 在console中打印文本
  10. linux内核的I2C子系统详解3——i2c-core.c初步分析、I2C总线的匹配机制
  11. java se入门_java SE 入门之运算符(第三篇)
  12. melogin.cn主页登录_melogin.cn登录官网
  13. 机器学习算法(8)——朴素贝叶斯、最小风险贝叶斯决策
  14. 山大计算机学院副院长屠长河,留学交流系列——山东大学计算机学院访问澳门大学...
  15. 关于vue脚手架cli3.0版本的一篇有关配置的文章,可以借鉴
  16. 二分法求解方程的根java_【数值分析】利用二分法和牛顿公式求解方程的根
  17. 通过pdf的url在线浏览pdf
  18. Python系列-Django-Ninja
  19. [Unity]Shader利用Geometry处理实现描边效果
  20. 在计算机教学过程当中,案例教学中计算机基础教学的运用论文

热门文章

  1. php布尔类型代码,php中的boolean(布尔)类型详解
  2. Java中的DatagramPacket与DatagramSocket的初步
  3. 在html中横坐标是纵坐标,excel 作图中次横坐标及次纵坐标的调试,以及excel自定义轴标签的步骤方法...
  4. redis 连接池_SpringBoot整合redis
  5. oracle 自治数据库 培训,Oracle数据库掌门人,Andrew Mendelsohn 谈自治数据库
  6. 在线ocr文字识别_PandaOCR:最佳免费 OCR 文字识别工具
  7. mysql导入csvnull,MySQL Workbench从CSV导入NULL
  8. scrapy分布式爬虫爬取淘车网
  9. MySQL基础课堂笔记
  10. 一次针对EduSrc的挖掘