大多数方法的第一个参数接收一个函数,并且对数组的每个元素调用一次该函数。如果是稀疏数组,对不存在的元素不调用传递的函数。在大多数情况下,调用提供的函数使用三个参数:数组元素,元素的索引,数组本身,通常情况只提供第一个参数,忽略后两个参数。

第二个参数是可选的,如果有第二个参数,则调用的函数被看做是第二个参数的方法,即在调用函数内使用this代表的是第二个参数。

数组方法是不会修改它们调用的原数组。当然,传递给这些方法的函数可以修改这些数组。

forEach():

方法从头至尾遍历数组,为每个元素调用指定的函数

注意:无法在所有元素都传递给调用的函数之前终止遍历(就是不能break or return)。

map():

数组的每一个元素传递给指定的函数,并返回一个数组,它包含该函数的返回值。

filter():

方法返回的数组元素是调用的数组的一个子集。传递函数是用来逻辑判定的即该函数返回true或false。filter会跳过稀疏数组中缺少的元素,它的返回数组总是稠密的,即压缩稀疏数组的空缺:

var dense = sparse.filter(function(){return false});

压缩空缺并删除undefined和null元素,可以这样使用filter():

  a  = a.filter(function(x){ return x!=undefined && x!=null});

every()和some():

是数组的逻辑判定:它们对数组元素应用指定的函数判定,返回true或false

every()方法就像数学中的“针对所有”:当且仅当对数组中的所有元素调用判定函数都返回true。

some()方法就像数学中的“存在”量词,当数组中至少有一个元素调用判定函数返回true。则判定函数返回true。并且仅当数值中的所有元素都返回false,它才返回false。

reduce()和reduceRight():

使用指定的函数将数组元素进行组合,生成单个值。这在函数式编程中是常见的操作,也可以称为“注入”和“折叠”如下:

var a = [1,2,3,4,5];

var sum = a.reduce(function(x,y){return x+y},0); //数组求和

var product = a.reduce(function(x,y){return x*y},1); //数组求积

var max = a.reduce(function(x,y){return x>y?x:y;}); //求最大值

reduce()需要两个参数。第一个是执行简化操作的函数。化简函数的任务就是用某种方法把两个值组合或化简为一个值,并返回化简后的值。第二个可选参数是一个传递给函数的初始值。简化操作函数,与上面提到的forEach和map使用的函数不同,比较熟悉的“数组元素”,“元素的索引”,“数组本身”将作为第2~4个参数传递给函数。第一个参数是到目前为止的化简操作累积的结果。第一次调用函数时,第一个参数是一个初始值即传递给reduce()的第二个参数。如上面描述,求max时没有使用第二个参数(即没有指定初始值)。当不指定初始值调用reduce()时,它将使用数组的第一个元素作为初始值。这意味着第一次调用简化函数就使用了第一个和第二个数组元素作为其第一个参数和第二个参数。

如果不带初始值参数调用reduce()将导致类型错误异常;

如果调用时只有一个值,数组只有一个元素并且没有指定初始值,或有一个空数组并指定一个初始值。reduce()只是简单地返回那个值而不会调用简化函数。

值得注意的是:every()和some()方法是一种类型的数组化简操作。但是不同的是,它们会尽早终止遍历而不总是访问每一个数组元素。

注意:数学计算不是reduce()和reduceRight()的唯一意图。参考前面提到的属性枚举时看到的一个例子

/*返回一个新对象,这个对象同时拥有o的属性和p的属性,如果o和p中有重名属性,使用p中的属性*/

function union(o,p){
return extend(extend({},o),p); } function extend(o,p){ for(prop in p){ o[prop] = p[prop]; } return o; } var objects = [{x:1},{y:2},{z:3}]; var mered = objects.reduce(union); //=>{x:1,y:2,z:3}

reduceRight工作原理与 reduce()一样,不同的是它按照数组索引从高到低处理数组

ECMAScript5提供了9个新数组方法:遍历、映射、过滤、检测、简化、和搜索数组的更多相关文章

  1. JavaScript学习笔记之 数组方法一 堆栈 和队列

    数组的方法 以及 堆栈的操作的方法 JavaScript是一种弱类型语言,不像其它程序语言需要严格定义数据类型.在JavaScript中数组可以任意修改变动,这样也就出现了一个问题,如果边遍历数组边操 ...

  2. ECMAScript 5中新增的数组方法

    ECMAScript 5中定义了9个新的数组方法,用于遍历.映射.过滤.检测.简化和搜索数组. 在开始介绍之前,很有必要对这几个新增的数组方法做一个概述.首先,大多数方法的第一个参数接收一个函数,并且 ...

  3. 《JS权威指南学习总结--7.9 ES5中的数组方法》

    内容要点: ES5中定义了9个新的数组方法来遍历.映射.过滤.检测.简化和搜索数组. 概述:首先,大多数方法的第一个参数接收一个函数,并且对数组的每个元素(或一个元素)调用一次该函数. 如果是稀疏数组 ...

  4. 【译】你应该了解的JavaScript数组方法

    让我们来做一个大胆的声明:for循环通常是无用的,而且还导致代码难以理解.当涉及迭代数组.查找元素.或对其排序或者你想到的任何东西,都可能有一个你可以使用的数组方法. 然而,尽管这些方法很有用,但是其 ...

  5. 25个JavaScript数组方法代码示例

    摘要: 通过代码掌握数组方法. 原文:通过实现25个数组方法来理解及高效使用数组方法(长文,建议收藏) 译者:前端小智 Fundebug经授权转载,版权归原作者所有. 要在给定数组上使用方法,只需要通 ...

  6. JavaScript数组方法--every、some、fill

    接上一篇,JavaScript数组方法--concat.push,继续其他的数组方法. every:every() 方法测试数组的所有元素是否都通过了指定函数的测试. 先看其使用方法: functio ...

  7. JavaScript 数组方法

    数组方法: 1.Array.join([param]) 方法:将数组中所有的元素都转换为字符串并连接起来,通过字符 param 连接,默认使用逗号,返回最后生成的字符串 2.Array.reverse ...

  8. JavaScript数组方法详解

    JavaScript数组方法详解 JavaScript中数组的方法种类众多,在ES3-ES7不同版本时期都有新方法:并且数组的方法还有原型方法和从object继承的方法,这里我们只介绍数组在每个版本中 ...

  9. JavaScript数组方法大集合

    JavaScript数组方法集合 本文总结一下js数组处理用到的所有的方法.自己做个笔记. 数组方法 concat() 合并两个或多个数组 concat()能合并两个或者多个数组,不会更改当前数组,而 ...

随机推荐

  1. TCP的成块数据流

    TCP使用滑动窗口协议的另一种方式来实现流量控制.该协议允许发送方在停止并等待确认之前可以连续发送多个分组.由于发送方不必每发送一个分组就停下来等确认,因此该协议可以加速数据的传输. 一.滑动窗口  ...

  2. Python3之collections模块

    简介 collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple namedtuple 是一个函数,它用来创建一个自定义的元组对象,并且规定了元组元素的个数 ...

  3. luogu4383 [八省联考2018]林克卡特树(带权二分+dp)

    link 题目大意:给定你 n 个点的一棵树 (边有边权,边权有正负) 你需要移除 k 条边,并连接 k 条权值为 0 的边,使得连接之后树的直径最大 题解: 根据 [POI2015]MOD 那道题, ...

  4. NOI.AC省选模拟赛第一场 T1 (树上高斯消元)

    link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...

  5. js的事件机制

    js的事件机制 解释:当我们的行为动作满足了一定的条件后,会触发某事务的执行. 内容: 1.单双击事件 单击:onclick 当鼠标单击时候会触发 双击:ondbclick 当鼠标双击时候会触发 2. ...

  6. 963 AlvinZH打怪刷经验(背包DP大作战R)

    963 AlvinZH打怪刷经验 思路 这不是一道普通的01背包题.大家仔细观察数据的范围,可以发现如果按常理来的话,背包容量特别大,你也会TLE. 方法一:考虑01背包的一个常数优化----作用甚微 ...

  7. CSS3 文本溢出问题

    一.单行: 效果: 实现这各效果必须要加上: text-overflow: ellipsis; /*文本溢出*/ overflow: hidden; /*配合使用:溢出隐藏*/ white-space ...

  8. 做开发,你少不了的淘宝镜像之--maven镜像

    maven阿里云中央仓库 修改maven根目录下的conf文件夹中的settings.xml文件,内容如下: <mirrors>    <mirror>      <id ...

  9. Go语言包和文件

    工作空间 Go语言工作空间:编译工具对源码目录有严格要求,每个工作空间 (workspace) 必须由bin.pkg.src三个目录组成. src ---- 项目源码目录,里面每一个子目录,就是一个包 ...

  10. 2018牛客多校6 - I Team Rocket KD树维护空间

    题意:给出n条铁路区间\([L,R]\),共有m个boom依时间顺序放置在\(k_i\)中,区间与\(k_i\)有交集的都被炸掉 求每次炸掉的铁路个数和最后输出所有id被炸的时间点 炸弹能炸到的区间满 ...