聊聊数组遍历方法

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);

参考

MDN Array

聊一聊数组的map、reduce、foreach等方法的更多相关文章

  1. javaScript 的 map() reduce() foreach() filter()

    map(映射), reduce(规约), forEach(遍历), filter(过滤),它们都是高阶函数,都是以传入不同的函数来以不同的方式操作数组元.ie都不支持 一.map方法 *概述 map( ...

  2. 数组遍历 map()、forEach() 及 字符串切割 split() / 字符串截取 slice()、substring()、substr()

    JS数组遍历的几种方式 JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代 ...

  3. Hadoop Map/Reduce的工作流

    问题描述 我们的数据分析平台是单一的Map/Reduce过程,由于半年来不断地增加需求,导致了问题已经不是那么地简单,特别是在Reduce阶段,一些大对象会常驻内存.因此越来越顶不住压力了,当前内存问 ...

  4. 【Javascript】JS遍历数组的三种方法:map、forEach、filter

    前言 近一段时间,因为项目原因,会经常在前端对数组进行遍历.处理,JS自带的遍历方法有很多种,往往不加留意,就可能导致知识混乱的现象,并且其中还存在一些坑.前端时间在ediary中总结了js原生自带的 ...

  5. JavaScript 中 map、foreach、reduce 间的区别

    一直对map.foreach.reduce这些函数很是生疏,今天看underscorejs时好好研究了一下,一研究我就更懵了,这不是一样嘛,都是遍历,所以我就去知乎找了一下,整理出了比较好的几个说法. ...

  6. 关于数组的map、reduce、filter

    map:map()方法定义在Array中,传入自己的参数,就得到一个新的Array作为结果 var aqiData = [ ["北京", 90], ["上海", ...

  7. JavaScript学习笔记:数组reduce()和reduceRight()方法

    很多时候需要累加数组项的得到一个值(比如说求和).如果你碰到一个类似的问题,你想到的方法是什么呢?会不会和我一样,想到的就是使用for或while循环,对数组进行迭代,依次将他们的值加起来.比如: v ...

  8. every、some、filter、map、forEach 方法的区别总结

    API功能描述: [every]:Boolean 遍历数组并执行回调,如果每个数组元素都能通过回调函数的测试则返回true,否则返回false.一旦返回false,将立即终止循环. [some]:Bo ...

  9. JS遍历数组的操作(map、forEach、filter等)

    1.map的用法 定义:原数组被“映射”成对应新数组 代码示例: var users = [ {name: "张含韵", "email": "zhan ...

随机推荐

  1. Java之集合(二十一)LinkedTransferQueue

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7505355.html 1.前言 本章介绍无界的阻塞队列LinkedTransferQueue,JDK7才提供了这 ...

  2. 【优化】Filddler用于移动端

    Fiddler是一个非常强大的Web调试工具,它能捕获所有客户端和服务器的http和https请求,我们可以对请求监视.设置断点,也能修改输入输出数据,这些特性使得Fiddler成为广大web开发者的 ...

  3. 【链表】Partition List

    题目: Given a linked list and a value x, partition it such that all nodes less than x come before node ...

  4. tomcat在eclipse创建过程分析

    在本地eclipse上创建一个tomcat server 即tomcat服务器时, 会复制一份tomca安装目录中的conf文件下的配置文件到这个tomcat server目录下 这个tomcat s ...

  5. System.Windows.Forms.Timer的简单用法

    Timer就是用来计时操作,如:你想在多少秒之后执行某个动作 Timer showTextBoxTimer = new Timer(); //新建一个Timer对象 showTextBoxTimer. ...

  6. java.util.Collection源码分析和深度讲解

    写在开头 java.util.Collection 作为Java开发最常用的接口之一,我们经常使用,今天我带大家一起研究一下Collection接口,希望对大家以后的编程以及系统设计能有所帮助,本文所 ...

  7. setInterval与setTimeout的区别

    在制作网页动态效果时,一定会遇到某些需求,要求某段程序等待多时时间后再开始执行,就像在我们的生活中一样,待会儿再开始做一件事.在JavaScript中主要通过定时器实现此类需求,本文将对定时器做一个概 ...

  8. 边框阴影box-shadow

    边框的阴影: 参数说明: box-shadow:1px 2px 3px 4px #ccc inset: 1px 从原点开始,沿x轴正方向的长度(倘若为负值,为沿x轴负方向的长度) 2px 从原点开始, ...

  9. THINK PHP 学习笔记20171115

    Part1:框架目录project 应用部署目录 ├─application 应用目录(可设置) │ ├─common 公共模块目录(可更改) │ ├─index 模块目录(可更改) │ │ ├─co ...

  10. SSM(Spring+SpringMVC+Mybstis)搭建,写给新手

    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis) 作用: SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为 ...