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 | varotherAry1 = ary.filter(function(item){returnitem>4;}); |
10 | varotherAry2 = $.grep(ary,function(item,index){ |
3、Array.map()和jquery的$.map()。在数组中的每个项上运行一个函数,并将全部结果作为数组返回。这个方法非常强大,尤其是作用于DOM数组时(在abcc项目上用过,对每个查询模块DOM生成查询字符串)。简单说就是把每个数组元素运算的结果作为新数组元素(还是很拗口)。
4 | varnewAry1 = ary.map(function(item){returnitem+1;}); |
8 | varnewAry2 = $.map(ary,function(item,index){returnitem+1;}); |
4、Array.every()方法。检查数组元素是否都符合某个条件,只要有一个不符合返回false,否则返回true
3 | alert(ary.every(function(item){returnitem>1})); |
4 | alert(ary.every(function(item){returnitem>2})); |
5、Array.some()方法。检查数组中元素是否符合某个条件,只要有一个符合返回true,否则返回false
1 | varary = [2,4,,6,8,10]; |
3 | alert(ary.some(function(item){returnitem>9;})); |
4 | alert(ary.some(function(item){returnitem>10;})); |
最后给出IE6/7/8的解决方案,让这些浏览器完美支持JS1.6的Array新方法。
03 | functionapplyIf(o, c) { |
06 | if(o[p]===undefined) { |
13 | applyIf(Array.prototype, { |
14 | indexOf :function(obj, idx) { |
15 | varfrom = idx ==null? 0 : (idx < 0 ? Math.max(0, arr.length + idx) : idx); |
16 | for(vari = from, l =this.length; i < l; i++) { |
17 | if(iinthis&&this[i] === obj) { |
23 | lastIndexOf :function(obj, idx) { |
24 | varlen =this.length, from = idx ==null? len - 1 : idx; |
26 | from = Math.max(0, len + from); |
28 | for(vari = from; i >= 0; i--) { |
29 | if(iinthis&&this[i] === obj) { |
35 | every :function(fn, thisObj) { |
37 | for(vari = 0; i < l; i++) { |
38 | if(iinthis&& !fn.call(thisObj,this[i], i,this)) { |
44 | some :function(fn, thisObj) { |
46 | for(vari = 0; i < l; i++) { |
47 | if(iinthis&& fn.call(thisObj,this[i], i,this)) { |
53 | filter :function(fn, thisObj) { |
54 | varl =this.length, res = [], resLength = 0; |
55 | for(vari = 0; i < l; i++) { |
58 | if(fn.call(thisObj, val, i,this)) { |
59 | res[resLength++] = val; |
65 | map :function(fn, thisObj) { |
66 | varl =this.length, res = []; |
67 | for(vari = 0; i < l; i++) { |
69 | res[i] = fn.call(thisObj,this[i], i,this); |
74 | forEach :function(fn, thisObj) { |
76 | for(vari = 0; i < l; i++) { |
78 | fn.call(thisObj,this[i], i,this); |