Posted in Javascript onApril 04, 2007
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 是匹配两个数组(集合)并把它们的元素用指定闭包进行计算
ArrayList类(增强版)
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@