javascript 王者归来一书里的一段Array扩展

最近在看这本书,感觉很不错。建议想学js的童鞋买本看看。

//any是一个集合迭代函数,它接受一个闭包作为参数
//当集合中的任何一个元素调用闭包的结果返回非false时,any()返回计算结果,否则返回false
Array.prototype.any = function(closure,_set){
	//第二个参数是一个处理计算结果的集合
	//这么设计的止的是为了在each方法中重用any
	_set = _set || false;
	
	//如果closure参数未定义
	if(typeof closure == 'undefined'){
		//规定为返回数组元素自身的值的函数
		closure = function(x){return x};
	};
	
	//如果closure参数不是函数
	if(typeof closure != 'function'){
		//那么它应该被转换成返回这个值的一个函数
		var c = closure;
		closure = function(x){return x == c};
	};
	
	//将第3个开始的参数转换为数组,因为这些值也将作为迭代调用时的参数
	var args = Array.apply(this,arguments).slice(2);
	
	//循环遍历数组中的每一个元素
	for(var i=0;i<this.length;i++){
		//以自定义的参数和数组的下标i为参数调用closure参数引用的闭包
		var rval = closure.apply(this,[this[i]].concat(args).concat(i));
		//如果返回值转换为boolean时为'真' 并且不是数值0
		if(rval || rval === 0){
			//如果_set存在,将计算结果放入_set集合
			if(_set && _set.put){
				_set.put(rval);
			}else{
				//否则,将第一个满足条件的结果的返回
				return rval;
			}
		}
	}
	//返回结果集
	return _set;
};

//each是一个集合迭代函数,它接受一个闭包作为参数和一组可选参数
//这个迭代函数依次将集合的每一个元素和可选参数用闭包进行计算,并将计算结果集返回
Array.prototype.each = function(closure){
	closure = closure || undefined;
	var _set = [];
	_set.put = _set.push;
	return this.any.apply(this,[closure,_set].concat(Array.apply(this,arguments).slice(1)));
}

//当且仅当集合中的每一个元素调用闭包函数的返回结果为true时,它才返回true
Array.prototype.all = function(closure){
	return this.each.apply(this,arguments).length = this.length;
}


//除去数组中的null,false元素
Array.prototype.trim = function(){
	return this.each();
}


//判断数组中是否包含某个元素
Array.prototype.contains = function(el){
	return this.any(function(x){ return x==el});
}

//返回数组中值等于el的第一个索引,若不存在,返回-1
Array.prototype.indexOf = function(el){
	return this.any(function(x,i){return el==x ? i : -1});
}

//获取从start到end的子数组
Array.prototype.subarr = function(start,end){
	end = end || Math.Infinity;
	return this.each(function(x,i){return i>=start && i<end ? x : null});
}


//这是一个集合迭代函数,它接受一个list和一个闭包
//返回这个闭包对于集合和list元素的一组匹配
Array.prototype.map = function(list,closure){
	if(typeof list == 'function' && typeof closure != 'function'){
		var li = closure;
		closure = list;
		list = li;
	};
	closure = closure || Array;
	return this.each(function(x,i){return closure(x,list[i])});
}
posted @ 2011-08-17 10:24  zjhsd2007  阅读(227)  评论(0编辑  收藏  举报