CiCeng
Google站内搜索
站内栏目
首页    JS对象   javascript Array扩展
javascript Array扩展
【作者:CCScript整理 阅读:183 最后更新:09-09-21】
最近看了一下developer.mozilla.org里的东西,发现它为Array对象添加了不少generic method,赶得上Prototype的热心程度。

indexOf

返回元素在数组的索引,没有则返回-1。与string的indexOf方法差不多。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:

Array.prototype.indexOf = function(el, start) {
    
var start = start || 0;
    
for ( var i=0; i < this.length; ++i ) {
        
if ( this[i] === el ) {
            
return i;
        }

    }

    
return -1;
}
;

var array = [2, 5, 9];
var index = array.indexOf(2);
// index is 0
index = array.indexOf(7);
// index is -1

lastIndexOf

与string的lastIndexOf方法差不多。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:

Array.prototype.lastIndexOf = function(el, start) {
    
var start = start || this.length;
    
if ( start >= this.length ) {
        start
= this.length;
    }

    
if ( start < 0 ) {
         start
= this.length + start;
    }

    
for ( var i=start; i >= 0; --i ) {
        
if ( this[i] === el ) {
            
return i;
        }

    }

    
return -1;
}
;

forEach

各类库中都实现相似的each方法。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:

Array.prototype.forEach = function(fn, thisObj) {
    
var scope = thisObj || window;
    
for ( var i=0, j=this.length; i < j; ++i ) {
        fn.call(scope,
this[i], i, this);
    }

}
;

function printElt(element, index, array) {
    print(
"[" + index + "] is " + element); // assumes print is already defined
}

[
2, 5, 9].forEach(printElt);
// Prints:
//
[0] is 2
//
[1] is 5
//
[2] is 9

every

如果数组中的每个元素都能通过给定的函数的测试,则返回true,反之false。换言之给定的函数也一定要返回true与false

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:

Array.prototype.every = function(fn, thisObj) {
    
var scope = thisObj || window;
    
for ( var i=0, j=this.length; i < j; ++i ) {
        
if ( !fn.call(scope, this[i], i, this) ) {
            
return false;
        }

    }

    
return true;
}
;

function isBigEnough(element, index, array) {
  
return (element <= 10);
}

var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true


some
 

类似every函数,但只要有一个通过给定函数的测试就返回true。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:

Array.prototype.some = function(fn, thisObj) {
    
var scope = thisObj || window;
    
for ( var i=0, j=this.length; i < j; ++i ) {
        
if ( fn.call(scope, this[i], i, this) ) {
            
return true;
        }

    }

    
return false;
}
;

function isBigEnough(element, index, array) {
  
return (element >= 10);
}

var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true

filter

把符合条件的元素放到一个新数组中返回。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:

Array.prototype.filter = function(fn, thisObj) {
    
var scope = thisObj || window;
    
var a = [];
    
for ( var i=0, j=this.length; i < j; ++i ) {
        
if ( !fn.call(scope, this[i], i, this) ) {
            
continue;
        }

        a.push(
this[i]);
    }

    
return a;
}
;

function isBigEnough(element, index, array) {
  
return (element <= 10);
}

var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);

map

让数组中的每一个元素调用给定的函数,然后把得到的结果放到新数组中返回。。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:

Array.prototype.map = function(fn, thisObj) {
    
var scope = thisObj || window;
    
var a = [];
    
for ( var i=0, j=this.length; i < j; ++i ) {
        a.push(fn.call(scope,
this[i], i, this));
    }

    
return a;
}
;

var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots is now [1, 2, 3]
//
numbers is still [1, 4, 9]

reduce

让数组元素依次调用给定函数,最后返回一个值,换言之给定函数一定要用返回值。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:

Array.prototype.reduce = function(fun /*, initial*/)
  
{
    
var len = this.length >>> 0;
    
if (typeof fun != "function")
      
throw new TypeError();
    
if (len == 0 && arguments.length == 1)
      
throw new TypeError();
    
var i = 0;
    
if (arguments.length >= 2){
      
var rv = arguments[1];
    }
else{
      
do{
        
if (i in this){
          rv
= this[i++];
          
break;
        }

        
if (++i >= len)
          
throw new TypeError();
      }
while (true);
    }


    
for (; i < len; i++){
      
if (i in this)
        rv
= fun.call(null, rv, this[i], i, this);
    }

    
return rv;
  }
;

var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });
// total == 6


联系我们   |  法律声明   |  关于   |  合作伙伴
© 2008 CiCeng.CCScript 版权所有 保留所有权利
沪ICP备08115912号