聊一聊ES5数组(Array)新增的那些方法

1、前言

ES5中新增的一些处理数组(Array)的方法, 对于用JavaScript处理数据很是有用。我总结了一下,给这些方法分了类,大致以下:html

2个索引方法:indexOf() 和 lastIndexOf();jquery

5个迭代方法:forEach()、map()、filter()、some()、every();git

2个归并方法:reduce()、reduceRight();github

下面咱们来具体看一看这些方法怎么用吧!数组

 

2、索引方法

索引方法包含indexOf()和lastIndexOf()两个方法,这两个方法都接收两个参数,第一个参数是要查找的项,第二个参数是查找起点位置的索引,该参数可选,若是缺省或是格式不正确,那么默认为0。两个方法都返回查找项在数组中的位置,若是没有找到,那么返回-1。区别就是一个从前日后找,一个从后往前找。浏览器

让咱们来看一个具体列子吧,首先定义一个数组:函数

var dataArray = [1, 7, 5, 7, 1, 3];

 

indexOf():该方法从数组的开头开始向后查找。this

console.log(dataArray.indexOf(7));              // 1     缺省, 从第一项开始查找
console.log(dataArray.indexOf(7, 's'));         // 1     格式不正确, 从第一项开始查找
console.log(dataArray.indexOf(7, 2));           // 3   从第三个项以后开始查找
console.log(dataArray.indexOf (2));             // -1    未找到, 返回-1

 

lastIndexOf(): 该方法从数组的末尾开始向前查找。es5

console.log(dataArray.lastIndexOf (7));       // 3     缺省, 从末尾第一项开始查找
console.log(dataArray.lastIndexOf (7, 's'));  // 3     格式不正确, 从末尾第一项开始查找
console.log(dataArray.lastIndexOf (7, 2));    // 1   从末尾第三项往前查找
console.log(dataArray.lastIndexOf ('4'));     // -1    未找到, 返回-1

 

值得注意的是,在比较第一个参数与数组中的每一项时,会使用全等操做符, 要求必须彻底相等,不然返回-1。spa

console.log(dataArray .lastIndexOf ('7'));   // -1,由于这里是字符串,并非数值类型
 
 

3、迭代方法

迭代方法包含some()、every()、filter()、map()和forEach()五个方法,这些方法都接收两个参数,第一个参数是一个函数,他接收三个参数,数组当前项的值、当前项在数组中的索引、数组对象自己。第二个参数是执行第一个函数参数的做用域对象,也就是上面说的函数中this所指向的值。注意,这几种方法都不会改变原数组。

 

every()和some()方法有些相似,咱们放在一块儿比较。

every():该方法对数组中的每一项运行给定函数,若是该函数对每一项都返回 true,则返回true。

some(): 该方法对数组中的每一项运行给定函数,若是该函数对任何一项返回 true,则返回true。

感受有点绕,咱们来对着例子讲一讲。   

首先咱们来看一下every方法,数组中的每一项都会执行给定的函数,若是数组中每一项执行该函数都返回true,那么咱们结果返回true,不然返回false。

下面例子中,当咱们设置item > 1时,第一项和第五项不符合,因此最终结果返回false。

下面例子中,当咱们设置item > 0时,全部项都符合,那么咱们最终结果为true。

 

接下来咱们来看some方法,数组中的每一项都会执行给定的函数,只要有一项为true,那么结果结果为true。

下面这个例子,当咱们设置item > 5时,第二项就符合,咱们直接返回true。

       

 

并且值得注意的是,some方法会在数组中任一项执行函数返回true以后,不在进行循环。

下面例子中,咱们设置item > 5,当数组中第二项7大于5时,中止循环,直接返回结果。

 

filter() :该方法对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。利用这个方法可对数组元素进行过滤筛选。

咱们来看下面的例子,当咱们设置item > 3时,数组中二、三、4像返回组成了一个新数组。

并且咱们能够看出,当咱们分别设置item > 3和item > '3'时, 返回的结果是同样的,由此咱们能够看出函数支持弱等于(==),不是必须全等于(===)。

 

filter() 方法相似,jquery中有个grep()方法也用于数组元素过滤筛选。

下面例子中,当咱们设置item > 3时,返回的数组和咱们用filter方法是同样的。

 

grep(array, function[, invert])方法,还有一个特性,当invert缺省或是为false,和filter方法同样,正常过滤出符合条件的数组元素,当invert值为true, 正好相反,他会过滤出函数返回值为false的数组元素。

咱们来看下面的例子,当设置了invert参数为true以后,函数返回以下过滤后的数组。

 

map(): 该方法对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。

咱们来看下面的例子,咱们为数组中的每一项乘以3,返回每一项相乘以后的数组。

 咱们接下来定义一个航班数组,每次返回该数组元素的航空公司,组成新数组。

 

 forEach(): 该方法对数组中的每一项运行给定函数。这个方法没有返回值。这个方法其实就是遍历循环,和for循环没有太大差异。jquery()也提供了相应的方法each()方法。

下面的例子咱们依次进行for循环、forEach方法、each方法的调用,最终执行结果相同。

 

 

4、归并方法

归并方法包含reduce()和reduceRight()两个方法,这两个方法都会迭代数组中的全部项,而后生成一个最终返回值。他们都接收两个参数,第一个参数是每一项调用的函数,函数接受是个参数分别是初始值,当前值,索引值,和当前数组,函数须要返回一个值,这个值会在下一次迭代中做为初始值。第二个参数是迭代初始值,参数可选,若是缺省,初始值为数组第一项,从数组第一个项开始叠加,缺省参数要比正常传值少一次运算。

 

reduce():该方法从数组的第一项开始,逐个遍历到最后一项。

这个方法比较复杂,咱们来看一个例子 

代码以下:

具体看这个代码,首先咱们在传入reduce的函数中打印了prev值,能够看到prev就是数组每两项的和。好比第一个是1,第二个就是1+7 = 8,以此类推。

最后,咱们把结果返回给了sum,那sum天然就是数组的每一项之和。这是没设置第二个参数的状况。

下面咱们来看看设置了第二个参数为2的例子。

咱们能够看出,当设置了第二个参数。咱们第一个prev输出的结果就是第二个参数的值。设置了这个参数,会多执行一次。

 

利用这种方法,咱们能够快速的把二维数组转化为一维数组。

 

顾名思义,reduceRight()就是从右到左,就不详细说了。

 

5、兼容性问题

ES5里这些处理数组的新方法,在IE6-IE8浏览器还未获得支持,因此咱们须要在IE这些低版本浏览器中引入这个es5-shim补丁,这样咱们就可使用它了。

补丁地址:https://github.com/es-shims/es5-shim

 

 

本博客文章皆为原创,未尽许可,请勿转载 (http://www.cnblogs.com/song-song/p/5329374.html

相关文章
相关标签/搜索