数组迭代是一项很重要的操作,在ECMAscript5之前主要使用for语句实现,后来ECMAscript5新增了五个实现迭代的方法:
1.forEach
为数组中的每个元素调用回调函数,数组对象可由回调函数修改。具体用法如下:
array.forEach(callbackfn[, thisArg])
回调函数语法如下:
function callbackfn(value, index, array)
例1 下面的例子使用forEach迭代数组numbers,然后计算数组元素的和并输出。
var numbers = [10, 11, 12]; var sum = 0; numbers.forEach( function addNumber(value) {sum += value;} ); ducument.write(sum); //33
2.every
确定数组所有的成员是否满足指定的测试。具体用法如下:
array.every(callbackfn[, thisArg])
例2 本例检测数组numbers中元素是否都为偶数,并进行提示。
function Checkifeven(value, index, ar) { document.write(value + ""); if (value % 2 === 0) return true; else return false; } var numbers = [2, 4, 5, 6, 8]; if (numbers.every(Checkifeven)) document.write("都是偶数"); else document.write("不全为偶数"); //2 4 5不全为偶数
除了数组对象以外,every方法可由具有length属性且具有已按数字编制索引的属性名的任何对象使用,如关联数组对象、Arguments等。
3.some
some的作用和every相似,回调函数的用法也与every的相同。确定指定的回调函数是否为数组中的任何元素均返回true。
4.map
对数组的每个元素调用定义的回调函数并返回包含结果的数组。即map函数将返回一个新数组,其中每个元素均为关联的原始数组元素的回调函数返回值。除了数组对象以外,map方法也可由具有length属性,且具有已按数字编制索引的属性名的任何对象使用,如关联数组对象、Arguments等。具体用法如下:
array.map(callbackfn[, thisArg])
例3 该例使用map方法映射数组numbers,把数组中每个元素的值除以divisor的值,然后返回新数组。其中回调函数和divisor都作为对象obj的属性存在,通过这种方法演示如何在map中使用thisArg参数。
var obj = { divisor: 10, remainder: function (value) { return value % divisor; } } var numbers = [6, 12, 25, 30]; var result = numbers.map(obj.remainder, obj); document.write(result); //6,2,5,0
5.filter
返回数组中的满足回调函数中指定条件的元素。返回值是一个包含回调函数为其返回true的所有值得新数组。如果回调函数为array的所有元素返回false,则新数组的长度为0。
例5 使用filter方法筛选出数组中的素数。
function Checkifprime(value, index, ar) { high = Math.floor(Math.sqrt(value)) + 1; for(var div = 2; div <= high; div ++) { if(value % div == 0) { return false; } } return true; } var numbers = [31, 33, 35, 37, 43]; var primes = numbers.filter(Checkifprime); document.write(primes); //31,37,43
例6 使用filter方法过滤数组numbers中值在minimum以及maximum范围内的元素。
var Checknumberrange = function(value) { if(typeof value !== 'number') return false; else return value >= this.minimum && value <= this.maximum; } var numbers = [6, 12, "15", 16, "the", -12]; var obj = {minimum: 10, maximum: 20} var result = numbers.filter(Checknumberrange, obj) document.write(result); //12, 16