author:月影
from:http://bbs.51js.com/thread-66469-1-1.html
<script> <br>function ArrayList() <br>{ <br> var ins = Array.apply(this, arguments); <br> ins.constructor = arguments.callee; <br> ins.base = Array; <br><br> ins.each = function(closure) <br> { <br> if(typeof closure == 'undefined') <br> closure = function(x){return x}; <br> if(typeof closure != 'function') <br> { <br> var c = closure; <br> closure = function(x){return x == c} <br> } <br><br> var ret = new ArrayList(); <br> var args = Array.apply(this, arguments).slice(1); <br><br> for(var i = 0; i < this.length; i++) <br> { <br> var rval = closure.apply(this, [this[i]].concat(args).concat(i)) <br> if(rval || rval === 0) <br> ret.push(rval); <br> } <br><br> return ret; <br> } <br><br> ins.trim = function() <br> { <br> return this.each.apply(this); <br> } <br><br> ins.all = function(closure) <br> { <br> return this.each.apply(this, arguments).length == this.length; <br> } <br><br> ins.any = function(closure) <br> { <br> return this.each.apply(this, arguments).length > 0; <br> } <br><br> ins.contains = function(el) <br> { <br> return this.any(function(x){return x == el}); <br> } <br><br> ins.indexOf = function(el) <br> { <br> var ret = this.each.call(this, function(x, i){return el == x?i:false})[0]; <br> return ret ? ret : -1; <br> } <br><br> ins.subarr = function(start, end) <br> { <br> end = end || Math.Infinity; <br> return this.each.call(this, function(x, i){return i >= start && i < end ? x : null}); <br> } <br><br> ins.valueOf = ins.toString; <br><br> ins.toString = function() <br> { <br> return '['+this.valueOf()+']'; <br> } <br><br> ins.map = function(list, closure) <br> { <br> if (typeof list == 'function' && typeof closure != 'function') <br> { <br> var li = closure; <br> closure = list; <br> list = li; <br> } <br> closure = closure || ArrayList; <br><br> return this.each.call(this, function(x, i){return closure.call(this, x, list[i])}); <br> }; <br><br> ins.slice = function() <br> { <br> return this.constructor(ins.base.prototype.slice.apply(this, arguments)); <br> } <br><br> ins.splice = function() <br> { <br> return this.constructor(ins.base.prototype.splice.apply(this, arguments)); <br> } <br><br> ins.concat = function() <br> { <br> return this.constructor(ins.base.prototype.concat.apply(this, arguments)); <br> } <br><br> return ins; <br>} <br><br>var a = new ArrayList(1,2,3); <br>alert(a.length); <br>alert(a); <br>alert(a instanceof Array); <br>alert(a.constructor); <br>alert(a instanceof ArrayList); // 可惜这个值不对,但是没法实现,只好放弃了 <br><br>alert(a.each(function(x){return x+x})); <br>alert(a.all(function(x){return x>0})); <br>alert(a.all(function(x){return x<1})); <br>alert(a.any(function(x){return x == 2})); <br><br>alert(a.contains(2)); <br>alert(a.contains(-1)); <br><br>var b = a.map([3,2], function(x, y){return x+y}); <br>alert(b); <br>alert(a.map([2,3,4])); <br><br>alert(a.indexOf(2)); <br>alert(a.indexOf(-1)); <br><br>alert(a.subarr(1,3)); <br>alert(a.toString()); <br>var b = new ArrayList(a,a); <br>alert(b.toString()); <br>alert(b.slice(1)); <br></script>
arr.all 是当数组(集合)中的所有元素都满足条件时,返回true,否则返回false
arr.any 是当数组(集合)中的所有元素中任意一个满足条件时,返回true,如果都不满足,返回false
arr.each 返回由符合条件的每一个元素构成的子数组
arr.map 是匹配两个数组(集合)并把它们的元素用指定闭包进行计算










