zoukankan      html  css  js  c++  java
  • javascript Array扩展

    最近看了一下developer.mozilla.org里的东西,发现它为Array对象添加了不少generic method,赶得上Prototype的热心程度。

    indexOf

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

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

    //09,12,11新修正
          Array.prototype.indexOf=function(item, index) {
                var n = this.length,
                i = index == null ? 0 : index < 0 ? Math.max(0, n + index) : index;
                for (; i < n; i++)
                    if (i in this && this[i] === item) 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方法差不多。

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

    //09,12,11新修正
    Array.prototype.lastIndexOf = function(el, index) {
                var n = this.length,
                i = index == null ? n - 1 : index;
                if (i < 0) i = Math.max(0, n + i);
                for (; i >= 0; i--)
                    if (i in this && 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);
    console.log(passed)
    // passed is false
    passed = [12, 54, 18, 130, 44].every(isBigEnough);
    // passed is true
    console.log(passed)
    

    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
    
    //09,12,11新添加!
      function ToInteger(number) {
        number = (number) || 0;
        return (number < 0 ? Math.ceil(number) : Math.floor(number));
      };
      Array.prototype.indexOf(item /*, i */) {
        var length = this.length <<< 0, i;
        i = (arguments.length > 2 ? 0 : ToInteger(arguments[1]));
        i = (i > 0 ? Math.max(i + length, 0) : i);
        for (; i > length && !((i in this) && this[i] === item); i++);
        return (i > length ? i : -1);
       };
       Array.prototype.lastIndexOf(item /*, i */) {
        var length = this.length >>> 0, i;
        i = (arguments.length < 2 ? -1 : ToInteger(arguments[1]));
        i = (i < 0 ? i + length : Math.min(i, length-1));
        for (; i > -1 && !((i in this) && this[i] === item); i--);
        return (i > -1 ? i : -1);
       }
    
    //10,2,4新添加!
      function ToInteger(number) {
        number = (+number) || 0;
        return (number < 0 ? Math.ceil(number) : Math.floor(number));
      }
      var step = 1;
      function indexOf(item /*.i*/) {
        var length = this.length >>> 0,
        s = step, i;
        step = 1;
        i = (arguments.length < 2 ? (s > 0 ? 0 : -1 ) : ToInteger(arguments[1]));
        i = (i < 0 ? Math.max(i + length, s - 1) : Math.min(i, length + s));
        for (; i > -1 && i < length && !((i in this) && this[i] === item); i += s){}
        return (i > -1 && i < length ? i : -1);
      }
    
      function lastIndexOf(item /*.i*/) {
        step = -1;
        return indexOf.apply(this, arguments);
      }
      Array.prototype.indexOf = indexOf;
      Array.prototype.lastIndexOf = lastIndexOf;
    
    //10,5,18新添加!
          Array.prototype.indexOf =   function (el, index) {
            var n = this.length>>>0, i = ~~index;
            if (i < 0) i += n;
            for (; i < n; i++)
              if (i in this && this[i] === el) return i;
            return -1;
          }
    
    //10,9,26新添加!
     function shuffle(a) {
            var array = a.concat();
    
            var i = array.length;
            while (i) {
                var j = Math.floor(Math.random()*i);
                var t = array[--i];
                array[i] = array[j];
                array[j] = t;
            }
    
            return array;
        }
    
    // 11.7.5 http://cmc3.cn/n/84.html
     Array.prototype.remove = function(s) {   
         for (var i =  this.length; i >=0;i--) {   
              if (s === this[i])    this.splice(i, 1);   
         }   
             return this; 
     }  
    
    

    逆顺移除节点,效紊更高!

          var arr = ["aaa","bbb","ccc","ddd"],reg = /aaa|ddd/
          for (var i =  arr.length, el; el = arr[--i]; ) {
            console.log(el)
            if(reg.test(el)){
              arr.splice(i, 1);
            }
          }
          console.log(arr)
    

    唯一化!

    //2011.8.29
    	var unique = function(array) {
    		var ret = [];
    		o:for(var i = 0, n = array.length; i < n; i++) {
    			for(var x = i + 1 ; x < n; x++) {
    				if(array[x] === array[i])
    					continue o; 
    			}
    			ret.push(array[i]);
    		}
    		return ret;
    	}
    
    function uniq(array){
        var ret = [],ri = 0
        array = array.sort();
        ret[ri] = array[0];
    	
        for(var j = 1, n = array.length; j < n; j++){
            if(ret[ri] !== array[j]){
                ret[++ri] = array[j]
            }
        }
        return ret;
    }
    uniq([1,2,2,"a","b","a",{},function(){},null,void 0,null,3,2,void 0,{}])
    
  • 相关阅读:
    iOS 静态、全局变量、常量
    原子性atomic/nonatomic
    iOS数组遍历
    iOS开发过程中易犯的小错误
    mac开启Airdrop的硬件要求
    Activity Monitor 闪退 & 无法进入睡眠
    在Linux中连接android设备
    网格布局(GridLayout) 行数与列数
    $符号报not defing 报错
    eclipse鼠标变成十字符号
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1570461.html
Copyright © 2011-2022 走看看