数组的方法(下)

ECMAScript5中的数组方法

  ECMAScript5定义了9个新的数组方法来遍历、映射、过滤、检测、简化和搜索数组。

  ECMAScript5中数组方法的概述:首先,大多数方法的第一个参数接收一个函数,并且对数组的每个元素(或一些元素)调用一次该函数。如果是稀疏数组,对不存在的元素不调用传递的函数。在大多数情况下,调用提供的函数使用三个参数:数组元素、元素的索引和数组本身。通常,只需要第一个参数值,可以忽略后两个参数。大多数的ECMAScript5数组的方法的第一个参数是一个函数,第二个参数是可选的。如果有第二个参数作为它的this关键字的值来使用。被调用的函数的返回值非常重要,但是不同的方法处理返回值的方式也不一样。ECMAScript5中数组的方法都不会修改它们调用的原始数组。当然,传递给这些方法的函数可以是修改这些数组的。

  

1.forEach()

  forEach()方法从头至尾遍历数组,为每个元素调用指定的函数。如上所述,传递的函数作为forEach()的第一个参数。然后forEach()使用三个参数调用该函数:数组元素、元素的索引和数组本身。如果只关心数组元素的值,可以编写只有一个参数的函数——额外的参数将忽略:

  //数组元素求和

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

  var  sum = 0;

  data.forEach(function(value){

    sum+=value;

  })        //将每个值累加到sum上

  sum       //15

  //每个数组元素的值自加一

  data.forEach(function(v,i,a){

    a[i] = v+1;

  })    

  data      //[2,3,4,5,6]

  

  注意,forEach()无法在所有元素都传递给调用的函数之前终止遍历。也就是说,没有for循环中使用的相应的break语句。如果要提前终止,必须把forEach()方法放在一个try块中,并不能抛出一个异常,如果forEach()调用的函数抛出foreach.break异常,循环会提前终止:

  function foreach(a,f,t){

    try{

      a.forEach(f,t);

    }

    catch(e){

      if(e==foreach.break) return;

      else throw e;

    }

  }

  foreach.break = new Error("StopIteration");

2.map()

  

  map()方法将调用的数组每个元素传递给指定的函数,并返回一个数组,它包含该数组的返回值。例如:

  a = [1,2,3];

  b = a.map(function(x){

    return x*x

  });  //b[1,4,9]

  传递给map()的函数应该有返回值。注意,map()返回的是新数组:它不修改调用的数组。如果是稀疏数组,返回的也是相同方式的稀疏数组:它具有相同的长度,相同的缺失元素。

3.fliter()

  fliter()方法返回的数组元素是调用的数组的一个子集。传递的函数是用来逻辑判定的:该函数返回true或false。调用判定的函数就像调用forEach()和map()一样。如果返回值为true或能转化为true的值,那么传递给判定函数的元素就是这个子集的成员,它将被添加到一个作为返回值的数组中。例如:

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

  smallvalues = a.filter(function(x){return x<3});          //[2,1]

  everyother = a.filter(function(x,i){return i%2==0});    //[5,3,1]

  注意,filter()会跳过稀疏数组中缺少的元素,他返回的数组总是稠密的。为了压缩稀疏数组的空缺,代码如下:

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

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

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

4.every()和some()

  every()和some()方法是数组的逻辑判定:它们对数组元素应用指定的函数进行判定,返回true或false。

  ervey()方法就像数学中的“针对所有”的全称量词:当且仅当针对数组中的所有元素调用判定函数都返回true,它才返回true:

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

    a.every(funmction(x){ return x<10; })       //true:所有值<10

    a.ervery(function(x){ return x%2 ===0; })  //false:不是所有的值都是偶数

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

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

    a.some(function(x){ return x%2 === 0; })  //true :a中含有非数值元素

    a.some(isNaN);                //false:a中不包含非数值元素

  注意,一旦every()和some()确认该返回什么值它们就回停止遍历数组元素。some()在判定函数第一次返回true后就返回true,但如果判定函数一直返回false,它将会遍历整个数组。every()恰好相反:它在判定函数第一次返回false之后就返回false,但如果判定函数一只返回true,他将会遍历整个数组。注意,根据数学上管理,在空数组上调用every()时返回true,some()返回false。

5.reduce()和reduceRight()

  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()需要两个参数。第一个是执行化简操作的函数。花间函数的任务就是用某种方法把两个值组合或化简为一个值,并返回化简后的值。在上述例子中,函数通过加法、乘法或区最大值的方法组合成两个值。第二个可选的参数是一个传递给函数的初始值。

  reduce()使用的函数与forEach()和map()使用的函数不同。比较熟悉的是,数组元素、元素的索引和数组本身将作为第2-4个参数传递给函数。第一个参数是到目前为止的化简操作积累的结果。第一次调用函数时,第一个参数是一个初始值,他就是传递给reduce()的第二个参数。在接下来的调用中,这个值就是上一次化简函数的返回值。在上面的第一个例子中,第一次调用化简函数时的参数是0和1.将两者相加并返回1。再次调用时的参数是1和2,它返回3.然后他计算3+3=6、6+4=10,最后计算10+5=15.最后的值是15,reduce()返回这个值。

  当reduce()只有一个参数:没有指定初始值时,它将使用数组的第一个元素作为初始值。

  在空数组上,不带初始值参数调用reduce()将导致类型错误异常。如果调用他的时候只有一个值——数组只有一个元素并且没有指定初始值,或者有一个空数组并且指定一个初始值——reduce()只是简单地返回那个值而不会调用化简函数。

  reduceRight()的工作原理和reduce()一样,不同的是它按照数组索引从高到低(从右到左)处理数组,而不是从低到高。如果化简操作的优先顺序是从右到左,你可能想使用它,例如:

  var a = [2,3,4]  

  var big = a.reduceRight( function(accumulator,value){

    return Math.pow(value,accumulator);

  } )

  注意,reduce()和reduceRight()都能接收一个可选的参数,它指定了化简函数调用时的this关键字的值。可选的初始值参数仍然需要占一个位置,如果想让化简函数作为一个特殊对象的方法调用,请看Function.bind()方法。

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

  

6.indexOf()和lastIndexOf()

  indexOf()和lastIndexOf()搜索到整个数组中具有给定值的元素,返回找到的第一个元素的索引或者如果没有找到就返回-1.indexOf()从头职位搜索,而lastIndexof()则反向搜索。

    a = [0,1,2,1,0];

    a.indexOf(1)    //1: a[1]是1

    a.lastIndexOf(1)  //3: a[3]是1

    a,indexOf(3)    //-1:没有值为3的元素

  不同于本节描述的其他方法,indexOf()和lastIndexOf()方法不接收一个函数作为其参数。第一个参数是需要搜索的值,第二个参数是可选的:它指定数组中的一个索引,从那里开始搜索。第二个参数也可以是负数,他代表相对数组末尾的偏移量,对于splice()方法:例如,-1指定数组的最后一个元素。

  如下函数在一个数组中搜索指定的值并返回包含所有匹配的数组索引的一个数组。它展示了如何运用indexOf()的第二个参数来查找除了第一个以外匹配的值。

  //在数组中查找所有出现的x,并返回一个包含匹配索引的数组

  function findall(a,x){

    var results = [],

      len = a.length,

      pos = 0;

    while(pos < len){

      pos = a.indexOf(x,pos);

      if(pos === -1) break;

      result.push(pos);

      pos = pos +1

    }

    return results;

  }

  注意,字符串也有indexOf()和lastIndexOf()方法,它们和数组方法的功能类似。

时间: 2024-11-09 05:34:00

数组的方法(下)的相关文章

数组常见方法下

在ECMAScript5中为数组定义了5个迭代方法,every().filter().forEach().map()和some(),每个方法都接受两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象--影响this的值.传入的这些方法中的函数会接收三个参数:数组项的值.该项在数组中的位置和数组对象本身.根据使用的方法不同,这个函数执行后的返回值可能会也可能不会影响访问的返回值. every() every()方法用于检测数组所有元素是否都符合指定条件,对数组中的每一项运行给定函数,

数组求和方法汇总

var arr = [1, 2, 3, 4, 5, 6];测试时我不想过度使用全局变量影响命名空间,所以没使用未声明变量.而是直接通过私有作用域设置静态私有变量,也可以用其他设计模式来限定变量作用域.因为数组对象的迭代方法也是一种遍历,所以也可以借助用来实现求和.一.利用数组对象的各迭代方法:1.array.every()查询是否有所有项都匹配的方法: 1 (function() { 2 var sum = 0; 3 4 function getSum(item, index, array) {

IOS 开发中遍历数组的方法及比较

数组,做为一种常用的数据类型,频繁出现在编码中,其中肯定少不了对数组的遍历,本博文对数组遍历,进行一下自己的归纳,如果是大牛,一笑而过就好,互相学习,欢迎指正. 话不多说直接进入主题 首先创建一个数组 /** 获取系统的语言数组 */ NSArray *languageArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"]; for 循环-C语言 因为在xCode 编译中支持C 语言,

一些ES5的操作数组的方法

在ES5规范中新增了不少操作数组的方法,特此罗列一下以备使用 1. forEach循环 有点类似jQuery的each循环 [12,23,36,4,5].forEach(function(v,k){ console.log(v)   得到元素值,    12,23,36,4,5 console.log(k)   得到元素下标 ,0,1,2,3,4 }) 方便在不借助三方库的情况下遍历各类数组 2.filter过滤器 用于筛选元素 var arr = [12,23,36,4,5].filter(f

js类数组转数组的方法(ArrayLike)

1. 什么是类数组ArrayLike 拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,这里你可以当做是个非负整数串来理解) 不具有数组所具有的方法 //类数组示例 var a = {'1':'gg','2':'love','4':'meimei',length:5}; Array.prototype.join.call(a,'+');//'+gg+love++meimei' //非类数组示例 var c = {'1':2}; //没有length属性就不是类数

程序流程的控制、数组和方法

本周主要3个点是程序流程控制 .数组和方法 程序流程控制主要是选择语句和循环语句:其中选择语句是分为 if语句 单分支.双分支.多分支:if语句中又可以嵌套if语句这就是if语句的嵌套格式为: if(条件1) {if(条件2){语句1} else{语句2} } else{ if(条件3){语句3} else{语句4} },  还有是switch语句格式switch(算数表达式){case 常量表达是式1: 语句块1:break; case常量表达式2:语句块2:break; default :语

js便利json 数组的方法

js便利json 数组的方法 通过Jason对象获取里面某个键的值方法: 1,对象["键"]. 2,对象.键. 这篇文章主要介绍了JQuery遍历json数组的3种方法,本文分别给出了使用each.for遍历json的方法,其中for又分成两种形式,需要的朋友可以参考下 $(function () { var tbody = ""; //------------遍历对象 .each的使用------------- //对象语法JSON数据格式(当服务器端回调回来的对

PHP 遍历数组的方法汇总

1. foreach() foreach()是一个用来遍历数组中数据的最简单有效的方法. #example1: <?php $colors= array('red','blue','green','yellow'); foreach ($colorsas$color){ echo "Do you like $color? <br />"; } ?> 显示结果: Do you like red? Do you like blue? Do you like gree

js中数组的方法

数组在笔试中经常会出现的面试题,javascript中的数组与其他语言中的数组有些不同,为了方便之后数组的方法学习,下面小编给大家整理了关于数组的操作方法,一起看看吧. 数组创建: 1.JavaScript中创建数组有两种方式,第一种是使用 Array 构造函数: var arr1 = new Array(); //创建一个空数组 var arr2 = new Array(20); // 创建一个包含20项的数组 var arr3 = new Array("lily", "l