javaScript 的 map() reduce() foreach() filter()
map(映射), reduce(规约), forEach(遍历), filter(过滤),它们都是高阶函数,都是以传入不同的函数来以不同的方式操作数组元。ie都不支持
一.map方法
*概述
map()
方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。(ps:map函数作用于数组)
1.语法
array.map(callback[, thisArg])
2.参数
callback
- 原数组中的元素经过该方法后返回一个新的元素。
currentValue
callback
的第一个参数,数组中当前被传递的元素。index
callback
的第二个参数,数组中当前被传递的元素的索引。array
callback
的第三个参数,调用map
方法的数组。
thisArg
- 执行
callback
函数时this
指向的对象。
3.返回值
由回调函数的返回值组成的新数组。
4.描述
map
方法会给原数组中的每个元素都按顺序调用一次 callback
函数。使用map方法处理数组时,数组在调用callback之前已经是确定了,也就是在callback过程中数组新增元素都不被调用。
*map方法示例
1.map的常用方法(采用ES6箭头函数的方法启动回调函数)
// 定义一个数组
var radii = [10, 20, 30]; // 由直径求圆的面积
var areas = radii.map((radius)=>{
var area = Math.PI * (radius * radius);
return area.toFixed(0);
}); console.log(areas);
//输出结果 ["314", "1257", "2827"]
2.阐释 thisArg 参数的用法,该参数指定 this 关键字可引用的对象。
//定义一个对象,里面有一个值和一个方法
var obj = {
divisor: 10,
remainder: function (value) { //求得到的余数
return value % this.divisor;
}
}
//定义一个数组
var array = [6, 12, 25, 30]; //obj参数指定的回调函数
var result = array.map(obj.remainder, obj);
console.log(result); //输出 [6, 2, 5, 0]
3.内置 JavaScript 方法用作回调函数。
var numbers = [9, 16];
var result = numbers.map(Math.sqrt); console.log(result);
// 输出: 3,4
4.一个 String
上使用 map 方法获取字符串中每个字符所对应的 ASCII 码组成的数组:
var map = Array.prototype.map
var a = map.call("Hello World", (x) =>{
return x.charCodeAt(0);
})
// a的值为[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
5.易犯错误
["1", "2", "3"].map(parseInt);
// 你可能觉的会是[1, 2, 3]
// 但实际的结果是 [1, NaN, NaN]
//通常上parseInt是接收一个参数,但实际上parseInt有两个参数,第二个参数是表示进制, map方法在调用callback函数时,会给它传递三个参数:当前正在遍历的元素, 元素索引, 原数组本身. //应该使用如下的用户函数returnInt function returnInt(element){
return parseInt(element,10);
} ["1", "2", "3"].map(returnInt);
// 返回[1,2,3]
二、reduce方法
*概述
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终为一个值,是ES5中新增的又一个数组逐项处理方法
1.语法
array .reduce ( callback,[ initialValue] )
2.参数
- callback(一个在数组中每一项上调用的函数,接受四个函数:)
- previousValue(上一次调用回调函数时的返回值,或者初始值)
- currentValue(当前正在处理的数组元素)
- currentIndex(当前正在处理的数组元素下标)
- array(调用reduce()方法的数组)
- initialValue(可选的初始值。作为第一次调用回调函数时传给previousValue的值)
3.返回值
由回调函数缩减产生的值
4.描述
reduce
对数组中存在的每个元素执行一次callback
函数,排除数组中的空洞,如果未提供initialValue
,则reduce将从索引1开始执行回调函数,跳过第一个索引。 如果提供了initialValue
,它将从索引0开始。
ie下Array.prototype.reduce为underfine不支持
*reduce方法示例
1.reduce有无传入initialValue
//不传initialValue值
var arr = [1,2,3];
arr.reduce(function(pre,cur,index,arr){return pre+cur});
//结果 6
//累加了两次
// 传入initialValue 值 var arr = [1,2,3]
arr.reduce(function(pre,cur,index,arr){return pre+cur},10);
//结果16
//累加了3次,初始值为10
2.拼接所有数组
var flattened = [[0, 1], [2, 3], [4, 5]].reduce( ( acc, cur ) => acc.concat(cur)); //输出[0, 1, 2, 3, 4, 5]
2.使用spread运算符和initialValue来绑定包含在对象数组中的数组
var friends = [
{ name: 'Anna', books: ['Bible', 'Harry Potter'], age: 21 },
{ name: 'Bob', books: ['War and peace', 'Romeo and Juliet'], age: 26 },
{ name: 'Alice', books: ['The Lord of the Rings', 'The Shining'], age: 18 }
] // 用reduce将对象数组中的books项相加起来
var allbooks = friends.reduce(function(prev, curr) {
return [...prev, ...curr.books];
}, ['Alphabet']); // 输出allbooks = ['Alphabet', 'Bible', 'Harry Potter', 'War and peace', 'Romeo and Juliet', 'The Lord of the Rings', 'The Shining']
reduceRight 方法(降序)
reduceRight的语法以及回调函数的规则和reduce方法是一样的,区别就是在与reduce是升序,即角标从0开始,而reduceRight是降序,即角标从arr.length-1开始。如果有初始值,则从最后一个数开始计算,如果没有初始值,则previousValue参数是数组中最后一个元素的值,currentValue是数组中倒数第二个元素的值。
function AppendToArray(previousValue, currentValue) {
return previousValue + currentValue;
}
var word = "retupmoc";
var result = [].reduceRight.call(word, AppendToArray, "the ");
// var result = Array.prototype.reduceRight.call(word, AppendToArray, "the ");
//有初始值,所以从初始值开始拼接 // the computer
三.foreach方法
*概述
foreach()
数组遍历方法
1.语法
arr .forEach(function callback(currentValue,index,array){
//你的迭代器
} [, thisArg ]);
2.参数
callback
函数为每个元素执行,采取三个参数:
currentValue
- 数组中正在处理的当前元素。
index
- 数组中正在处理的当前元素的索引。
array
- 正在应用
forEach()
的数组。
thisArg Optional
执行callback
时使用的值this
3.返回值
返回新创建的数组
4.描述
forEach()
以升序对数组中存在的每个元素执行一次所提供的callback
。 对于已删除或未初始化的索引属性(即稀疏数组),不会调用它。
使用if或者(return true, false)跳出循环
*foreach方法示例
//打印数组的内容
function logArrayElements(element, index, array) {
console.log('a[' + index + '] = ' + element);
} // Notice that index 2 is skipped since there is no item at
// that position in the array.
[2, 5, , 9].forEach(logArrayElements);
// l输出结果
// a[0] = 2
// a[1] = 5
// a[3] = 9
//使用thisArg
function Counter() {
this.sum = 0;
this.count = 0;
}
Counter.prototype.add = function(array) {
array.forEach(function(entry) {
this.sum += entry;
++this.count;
}, this);
//使用this执行callback
}; var obj = new Counter();
obj.add([2, 5, 9]);
obj.count
//
obj.sum
16
四.filter方法
*概述
filter()
方法使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组。
1.语法
var new_arrary = arr.filter(callback[, thisArg])
2.参数
callback
用来测试数组的每个元素的函数。调用时使用参数 (element, index, array)。
返回true表示保留该元素(通过测试),false则不保留。thisArg
可选。执行callback
时的用于this
的值。
3.返回值
返回新创建的数组
4.描述
filter
为数组中的每个元素调用一次 callback
函数,并利用所有使得 callback
返回 true 或 等价于 true 的值 的元素创建一个新数组。
*filter
方法示例
//排除掉小于10的值
var isBigEnough=(element)=> {
return element >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]
javaScript 的 map() reduce() foreach() filter()的更多相关文章
- Python的函数式编程: map, reduce, sorted, filter, lambda
Python的函数式编程 摘录: Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 函数是Python内建支持的一种封装,我们通过把大段代码 ...
- JavaScript 中 map、foreach、reduce 间的区别
一直对map.foreach.reduce这些函数很是生疏,今天看underscorejs时好好研究了一下,一研究我就更懵了,这不是一样嘛,都是遍历,所以我就去知乎找了一下,整理出了比较好的几个说法. ...
- JavaScript中Map和ForEach的区别
译者按: 惯用Haskell的我更爱map. 原文: JavaScript — Map vs. ForEach - What’s the difference between Map and ForE ...
- python笔记十四(高阶函数——map/reduce、filter、sorted)
一.map/reduce 1.map() map(f,iterable),将一个iterable对象一次作用于函数f,并返回一个迭代器. >>> def f(x): #定义一个函数 ...
- map,reduce和filter函数
numArray = [1, 2, 3, 4, 5] def ercifang(x): return x ** 2 def map_test(func, numArray): li = [] for ...
- Javascript的map与forEach的区别
原理: 高级浏览器支持forEach方法语法:forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文: forEach:用来遍历数组中的每一项:这个方法执行是没 ...
- JavaScript高阶函数map/reduce、filter和sort
map() 举例说明,比如我们有一个函数f(x)=x²,要把这个函数作用在一个数组[1,2,3,4,5,6,7,8,9]上. 由于map()方法定义在JavaScript的Array中,我们调用Arr ...
- 用scheme重写Python的三大函数map reduce 和filter
重写过程中,发现这种做法能加深对递归的理解,而且reduce还体现了函数式编程是如何通过参数传递来实现命令式编程中的状态改变的. (define (imap f x . y) (if (null? y ...
- JavaScript中map函数和filter的简单举例
JavaScript的数组迭代器函数map和filter,可以遍历数组时产生新的数组,和python的map函数很类似 1> filter是满足条件的留下,是对原数组的过滤:2> map则 ...
随机推荐
- 案例:java进制互转
十 进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBina ...
- Django框架----ORM数据库操作
一.ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用 ...
- Python之路----内置函数补充与匿名函数
内置函数补充:reversed()保留原列表,返回一个反向的迭代器 l = [1,2,3,4,5] l.reverse() print(l) l = [1,2,3,4,5] l2 = reversed ...
- 笔试题二(java面向对象、多线程、集合)
1.final关键字的特点 final修饰变量时,在堆内存中的地址是不变的,但对象的内容是可变的.//思考,找例子 2.静态变量的特点 实例变量是用对象引用,要先实例化对象,而静态变量属于类,只要类加 ...
- Python入门之面向对象编程(二)python类的详解
本文通过创建几个类来覆盖python中类的基础知识,主要有如下几个类 Animal :各种属性.方法以及属性的修改 Dog :将方法转化为属性并操作的方法 Cat :私人属性讲解,方法的继承与覆盖 T ...
- 逆向与BOF基础——注入shellcode并执行&Return-to-libc
逆向与BOF基础--注入shellcode并执行 准备阶段 下载安装execstack. 本次实验实验的shellcode是心远的文章中生成的代码,即\x31\xc0\x50\x68\x2f\x2f\ ...
- 20145331魏澍琛《网络对抗》Exp5 MSF基础应用
20145331魏澍琛<网络对抗>Exp5 MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit:渗透攻击的模块合集,将真正 ...
- Android项目开发三
微博客户端开发 本周学习计划 运用OAuth相关知识,解决上周出现的微博验证问题. 看懂微博客户端登录.用户主页等功能代码. 将程序中存在的问题解决. 实际完成情况 本周继续研究了OAuth相关知识, ...
- Android 实践项目开发二
在地图开发中项目中,我这周主要完成的任务是和遇到的问题是以下几个方面. 1.在本次的项目中主要是利用百度地图的.jar包实现地图的定位与搜索功能,需要在百度地图开发中心网站取得 密钥,并下载相关.ja ...
- 完美解决vim在终端不能复制的问题
以前 用xshell,或者其他工具ssh到远程服务器,vim不能复制,搜索说是vim的 -xterm_clipboard没有开启. 今天发现,至少鼠标复制是不需要这个东东的! 在stackoverfl ...