JavaScript 1.6 引入了几个新的Array 方法,具体的介绍见:New in JavaScript 1.6。这些方法已经被写进了ECMA262 V5。现代浏览器(IE9/Firefox/Safari/Chrome/Opera)都已经支持,但IE6/7/8不支持。jquery的工具方法中提供了类似的功能。
1、Array.forEach()和jquery的$().each()。在数组中的每个项上运行一个函数。类似java5增强的for循环。
4 | ary.forEach( function (i){alert(i);}); |
7 | $(ary).each( function (){alert( this );}); |
9 | $(ary).each( function (index,item){alert(item);}); |
2、Array.filter()和jquery的$.grep()。在数组中的每个项上运行一个函数,并将函数返回真值的项作为数组返回。简单的说就是用一个条件过滤掉不符合的数组元素,剩下的符合条件的元素组合成新的数组返回。
04 | var otherAry1 = ary.filter( function (item){ return item>4;}); |
10 | var otherAry2 = $.grep(ary, function (item,index){ |
3、Array.map()和jquery的$.map()。在数组中的每个项上运行一个函数,并将全部结果作为数组返回。这个方法非常强大,尤其是作用于DOM数组时(在abcc项目上用过,对每个查询模块DOM生成查询字符串)。简单说就是把每个数组元素运算的结果作为新数组元素(还是很拗口)。
4 | var newAry1 = ary.map( function (item){ return item+1;}); |
8 | var newAry2 = $.map(ary, function (item,index){ return item+1;}); |
4、Array.every()方法。检查数组元素是否都符合某个条件,只要有一个不符合返回false,否则返回true
3 | alert(ary.every( function (item){ return item>1})); |
4 | alert(ary.every( function (item){ return item>2})); |
5、Array.some()方法。检查数组中元素是否符合某个条件,只要有一个符合返回true,否则返回false
1 | var ary = [2,4,,6,8,10]; |
3 | alert(ary.some( function (item){ return item>9;})); |
4 | alert(ary.some( function (item){ return item>10;})); |
最后给出IE6/7/8的解决方案,让这些浏览器完美支持JS1.6的Array新方法。
03 | function applyIf(o, c) { |
06 |
if (o[p]===undefined) { |
13 | applyIf(Array.prototype, { |
14 |
indexOf : function (obj, idx) { |
15 |
var from = idx == null ? 0 : (idx < 0 ? Math.max(0, arr.length + idx) : idx); |
16 |
for ( var i = from, l = this .length; i < l; i++) { |
17 |
if (i in this && this [i] === obj) { |
23 |
lastIndexOf : function (obj, idx) { |
24 |
var len = this .length, from = idx == null ? len - 1 : idx; |
26 |
from = Math.max(0, len + from); |
28 |
for ( var i = from; i >= 0; i--) { |
29 |
if (i in this && this [i] === obj) { |
35 |
every : function (fn, thisObj) { |
37 |
for ( var i = 0; i < l; i++) { |
38 |
if (i in this && !fn.call(thisObj, this [i], i, this )) { |
44 |
some : function (fn, thisObj) { |
46 |
for ( var i = 0; i < l; i++) { |
47 |
if (i in this && fn.call(thisObj, this [i], i, this )) { |
53 |
filter : function (fn, thisObj) { |
54 |
var l = this .length, res = [], resLength = 0; |
55 |
for ( var i = 0; i < l; i++) { |
58 |
if (fn.call(thisObj, val, i, this )) { |
59 |
res[resLength++] = val; |
65 |
map : function (fn, thisObj) { |
66 |
var l = this .length, res = []; |
67 |
for ( var i = 0; i < l; i++) { |
69 |
res[i] = fn.call(thisObj, this [i], i, this ); |
74 |
forEach : function (fn, thisObj) { |
76 |
for ( var i = 0; i < l; i++) { |
78 |
fn.call(thisObj, this [i], i, this ); |