聊一聊数组的map、reduce、foreach等方法
聊聊数组遍历方法
JS 数组的遍历方法有好几个:
- every
- some
- filter
- foreach
- map
- reduce
接下来我们来一个个地交流下。
every()
arr.every(callback[, thisArg])
返回值:true | false
是否改变原数组:不改变原数组
解析:
every() 方法用来测试数组中的每一项是否都通过了callback函数的测试;只有全部通过才返回 true;否则 false。
本文出现的 callback 没有特别声明都是表示包含 element, index, array 三个参数的函数。
例子:
// 检测数组中的所有元素是否都大于或等于100
[].every((ele) => ele >= 100); // true
[1, 2, 3].every((ele) => ele >= 100); // false
some()
arr.some(callback[, thisArg])
返回值:true | false
是否改变原数组:不改变
解析:
some() 跟 every() 类似,只是 every 要每一项都通过 callback 才返回 true,而 some 只要有通过 callback 的就返回 true;some 为逻辑或,every 为逻辑与。
例子:
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true
filter()
var newArr = arr.filter(callback[, thisArg])
返回值:新数组
是否改变原数组:不改变原数组
解析:
filter() 方法会对数组中的每一项(首先这项是有值的)进行调用 callback 函数,并根据调用结果返回的 true 或 false 来组建一个新的数组(该数组是原数组的子集)。
即过滤,只有符合的(调用 callback 返回 true 的)才加入到新数组中。
例子:
const isBigEnough = value => value >= 10;
let [...spread] = [12, 4, 8, 120, 44];
let filtered = spread.filter(isBigEnough);
// filtered: [12, 120, 44]
// spread: [12, 4, 8, 120, 44]
forEach()
array.forEach(callback[, thisArg])
返回值:undefined
是否改变原数组:改不改变要看 callback
解析:
forEach() 方法按升序为数组中含有效值的每一项执行一次 callback 函数,那些已删除(使用delete方法等情况)或者未初始化的项将被跳过(但不包括那些值为 undefined 的项)(例如在稀疏数组上)。反正它就是很死板。
例子:
// three 呢?它被跳过了,原因是到two时,使数组发生了变化,导致所有剩下的项上移一个位置,所以three被跳过了
let words = ['one', 'two', 'three', 'four'];
words.forEach((word) => {
console.log(word);
if ( word === 'two' ) {
words.shift();
}
});
// one
// two
// four
map()
let newArr = arr.map(callback[, thisArg])
返回值:新数组
是否改变原数组:不改变
解析:
map() 方法就是数组中的每一项(有值)按顺序都调用一次 callback 函数,然后每一项的返回结果组成一个新的数组作为整个map方法的返回值。
例子:
let str = '12345';
Array.prototype.map.call(str, (x) => x).reverse().join('');
// '54321'
reduce()
arr.reduce(callback[, initialValue])
返回值:callback函数累计处理的结果
是否改变原数组:
解析:
reduce() 方法的 callback 有四个参数,比之前说的多了一个累计的返回值;四个参数:accumulator、currentValue、currentIndex、array;initialValue 是用作第一个调用 callback 的第一个参数的值,默认使用数组中的第一个元素。
reduce() 方法跟 map 有点相似,都是数组中的每一个元素(有效值)一次执行 callback 函数,多就多在它会存上上一次 callback 计算结果作为下一次的参数。
如果没有提供 initialValue, reduce会从索引1的地方开始执行 callback方法,跳过第一个索引。如果提供 initialValue, 从索引0开始
例子:
// 求和
let sum = [0, 1, 2, 3, 4].reduce((prev, curr) => prev + curr, 0);
// 计算数组中每个元素出现的次数
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
let countedNames = names.reduce((allNames, name) => {
if ( name in allNames ) {
allNames[name]++;
} else {
allNames[name] = 1;
}
return allNames;
}, {});
// countedNames:
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }
// 数组去重
let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
let result = arr.sort().reduce((init, current) => {
// 主要是排了序
if ( init.length === 0 || init[init.length - 1] !== current ) {
init.push(current);
}
return init;
}, []);
console.log(result);
参考
聊一聊数组的map、reduce、foreach等方法的更多相关文章
- javaScript 的 map() reduce() foreach() filter()
map(映射), reduce(规约), forEach(遍历), filter(过滤),它们都是高阶函数,都是以传入不同的函数来以不同的方式操作数组元.ie都不支持 一.map方法 *概述 map( ...
- 数组遍历 map()、forEach() 及 字符串切割 split() / 字符串截取 slice()、substring()、substr()
JS数组遍历的几种方式 JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代 ...
- Hadoop Map/Reduce的工作流
问题描述 我们的数据分析平台是单一的Map/Reduce过程,由于半年来不断地增加需求,导致了问题已经不是那么地简单,特别是在Reduce阶段,一些大对象会常驻内存.因此越来越顶不住压力了,当前内存问 ...
- 【Javascript】JS遍历数组的三种方法:map、forEach、filter
前言 近一段时间,因为项目原因,会经常在前端对数组进行遍历.处理,JS自带的遍历方法有很多种,往往不加留意,就可能导致知识混乱的现象,并且其中还存在一些坑.前端时间在ediary中总结了js原生自带的 ...
- JavaScript 中 map、foreach、reduce 间的区别
一直对map.foreach.reduce这些函数很是生疏,今天看underscorejs时好好研究了一下,一研究我就更懵了,这不是一样嘛,都是遍历,所以我就去知乎找了一下,整理出了比较好的几个说法. ...
- 关于数组的map、reduce、filter
map:map()方法定义在Array中,传入自己的参数,就得到一个新的Array作为结果 var aqiData = [ ["北京", 90], ["上海", ...
- JavaScript学习笔记:数组reduce()和reduceRight()方法
很多时候需要累加数组项的得到一个值(比如说求和).如果你碰到一个类似的问题,你想到的方法是什么呢?会不会和我一样,想到的就是使用for或while循环,对数组进行迭代,依次将他们的值加起来.比如: v ...
- every、some、filter、map、forEach 方法的区别总结
API功能描述: [every]:Boolean 遍历数组并执行回调,如果每个数组元素都能通过回调函数的测试则返回true,否则返回false.一旦返回false,将立即终止循环. [some]:Bo ...
- JS遍历数组的操作(map、forEach、filter等)
1.map的用法 定义:原数组被“映射”成对应新数组 代码示例: var users = [ {name: "张含韵", "email": "zhan ...
随机推荐
- Linux 删除文件夹和文件的命令(转载)
Linux 删除文件夹和文件的命令 听语音 | 浏览:93339 | 更新:2013-05-02 18:40 | 标签:linux 文件夹 linux删除目录很简单,很多人还是习惯用rmdir,不过一 ...
- windows下如何下载并安装Python
1.打开Python官网,点download中的windows(或者打开网址https://www.python.org/downloads/windows/) 2.下载exe后缀的可执行文件,根据自 ...
- 前端通信:ajax设计方案(四)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组
马上要过年了,哎,回家的心情也特别的激烈.有钱没钱,回家过年,家永远是舔舐伤口最好的地方.新的一年继续加油努力. 上次做了前端的ajax的上传文件技术,支持单文件,多文件上传,并对文件的格式和大小进行 ...
- springboot-8- 日志配置
1, logback配置 springboot 默认支持logback, 自动加载classpath:logback-spring.xml <!-- logback多文件输出 --> &l ...
- elasticsearch 导入基础数据并索引之 geo_shape
我们看到的图形, 实际是由点来完成的, 有2种类型的格子模型可用于地理星座, 默认使用的是geoHash, 还有一种4叉树(quad trees), 也可用于 判断形状与索引的形状关系 1), int ...
- HDFS:分布式文件系统
HDFS是GFS的简化版,它同一时刻只允许一个用户对同一文件进行追加写操作(GFS允许并发写).它适合存储大文件,并提供高吞吐量的顺序读/写访问. 它的早期版本两大问题,例如:单点失效和水平扩展不佳. ...
- BI实战派:医疗BI项目落地方案
任何BI项目面临的两大难题是项目价值和基础数据,BI项目应该给企业带来管理优化.业绩增长.医院面临的两大难题,一:绩效管理(奖金分配):二:医患关系:在医院开始自负盈亏时日常基本运营管理显得非常重要. ...
- 【LeetCode题解】160_相交链表
目录 160_相交链表 描述 解法一:哈希表 思路 Java 实现 Python 实现 解法二:双指针(推荐) 思路 Java 实现 Python 实现 160_相交链表 描述 编写一个程序,找到两个 ...
- centos6安装docker,先升级系统内核
安装docker,其他的源可能导致你的内核和docker的版本不一致,需要将系统内核升级至3.x 查看当前系统版本 cat /etc/issue 查看当前内核版本 uname -r #uname -a ...
- Oracle - 为子查询提供动态结果集
曾经遇到过这样一个需求:要求为method传入String,内容如"用户ID0,用户ID1,用户ID2...",然后根据这些ID返回一个结果集作为数据表供别人查询. SELECT ...