ArrayList类(增强版)

  Author:月影

  From:http://bbs.51js.com/thread-66469-1-1.html

  

复制代码 代码如下:

  <script>

  function ArrayList()

  {

  var ins = Array.apply(this, arguments);

  ins.constructor = arguments.callee;

  ins.base = Array;

  ins.each = function(closure)

  {

  if(typeof closure == 'undefined')

  closure = function(x){return x};

  if(typeof closure != 'function')

  {

  var c = closure;

  closure = function(x){return x == c}

  }

  var ret = new ArrayList();

  var args = Array.apply(this, arguments).slice(1);

  for(var i = 0; i < this.length; i++)

  {

  var rval = closure.apply(this, [this[i]].concat(args).concat(i))

  if(rval || rval === 0)

  ret.push(rval);

  }

  return ret;

  }

  ins.trim = function()

  {

  return this.each.apply(this);

  }

  ins.all = function(closure)

  {

  return this.each.apply(this, arguments).length == this.length;

  }

  ins.any = function(closure)

  {

  return this.each.apply(this, arguments).length > 0;

  }

  ins.contains = function(el)

  {

  return this.any(function(x){return x == el});

  }

  ins.indexOf = function(el)

  {

  var ret = this.each.call(this, function(x, i){return el == x?i:false})[0];

  return ret ? ret : -1;

  }

  ins.subarr = function(start, end)

  {

  end = end || Math.Infinity;

  return this.each.call(this, function(x, i){return i >= start && i < end ? x : null});

  }

  ins.valueOf = ins.toString;

  ins.toString = function()

  {

  return '['+this.valueOf()+']';

  }

  ins.map = function(list, closure)

  {

  if (typeof list == 'function' && typeof closure != 'function')

  {

  var li = closure;

  closure = list;

  list = li;

  }

  closure = closure || ArrayList;

  return this.each.call(this, function(x, i){return closure.call(this, x, list[i])});

  };

  ins.slice = function()

  {

  return this.constructor(ins.base.prototype.slice.apply(this, arguments));

  }

  ins.splice = function()

  {

  return this.constructor(ins.base.prototype.splice.apply(this, arguments));

  }

  ins.concat = function()

  {

  return this.constructor(ins.base.prototype.concat.apply(this, arguments));

  }

  return ins;

  }

  var a = new ArrayList(1,2,3);

  alert(a.length);

  alert(a);

  alert(a instanceof Array);

  alert(a.constructor);

  alert(a instanceof ArrayList); // 可惜这个值不对,但是没法实现,只好放弃了

  alert(a.each(function(x){return x+x}));

  alert(a.all(function(x){return x>0}));

  alert(a.all(function(x){return x<1}));

  alert(a.any(function(x){return x == 2}));

  alert(a.contains(2));

  alert(a.contains(-1));

  var b = a.map([3,2], function(x, y){return x+y});

  alert(b);

  alert(a.map([2,3,4]));

  alert(a.indexOf(2));

  alert(a.indexOf(-1));

  alert(a.subarr(1,3));

  alert(a.toString());

  var b = new ArrayList(a,a);

  alert(b.toString());

  alert(b.slice(1));

  </script>

arr.all 是当数组(集合)中的所有元素都满足条件时,返回true,否则返回false

  arr.any 是当数组(集合)中的所有元素中任意一个满足条件时,返回true,如果都不满足,返回false

  arr.each 返回由符合条件的每一个元素构成的子数组

  arr.map 是匹配两个数组(集合)并把它们的元素用指定闭包进行计算