扩展你的javascript数组

页面导航:首页 > 网络编程 > JavaScript > 扩展你的javascript数组

扩展你的javascript数组

来源: 作者: 时间:2016-02-05 11:06 【

现在做的项目用的正是jquery的框架,Jquery miniui,其功能强大、性能卓越、易于上手、不失灵活,在不断学习和研发的过程中,miniui给了很多的启发,让我重新认识了js的本质,意识到了

现在做的项目用的正是jquery的框架,Jquery miniui,其功能强大、性能卓越、易于上手、不失灵活,在不断学习和研发的过程中,miniui给了很多的启发,让我重新认识了js的本质,意识到了js的强大功能。

使用javascript的时候难免会用到数组操作,进来js的功能越来越强大,使用范围越来越广,很多语言的各种数据结构,本质上都是一样的,都是把基本数据类型做封装,形成功能各异,各有特色的对象、数组、集合等等。接下来我们重点讨论一下js的数组操作。

先说一下js的map,map本质上使用js的数组和对象相结合而实现的,可以实现存取数据,查询和删除,判断存在与否等等,既然要模仿写出就应该具备其所有功能。

 

两个数组的交并补集:

 

/** 
* each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 
* 这个迭代函数依次将集合的每一个元素和可选参数用函数进行计算,并将计算得的结果集返回 
{%example 
<script> 
var a = [1,2,3,4].each(function(x){return x > 2 ? x : null}); 
var b = [1,2,3,4].each(function(x){return x < 0 ? x : null}); 
alert(a); 
alert(b); 
</script> 
%} 
* @param {Function} fn 进行迭代判定的函数 
* @param more ... 零个或多个可选的用户自定义参数 
* @returns {Array} 结果集,如果没有结果,返回空集 
*/ 
Array.prototype.each = function(fn){ 
fn = fn || Function.K; 
var a = []; 
var args = Array.prototype.slice.call(arguments, 1); 
for(var i = 0; i < this.length; i++){ 
var res = fn.apply(this,[this[i],i].concat(args)); 
if(res != null) a.push(res); 
} 
return a; 
}; 

/** 
* 得到一个数组不重复的元素集合
 
* 唯一化一个数组 
* @returns {Array} 由不重复元素构成的数组 
*/ 
Array.prototype.uniquelize = function(){ 
var ra = new Array(); 
for(var i = 0; i < this.length; i ++){ 
if(!ra.contains(this[i])){ 
ra.push(this[i]); 
} 
} 
return ra; 
}; 

/** 
* 求两个集合的补集 
{%example 
<script> 
var a = [1,2,3,4]; 
var b = [3,4,5,6]; 
alert(Array.complement(a,b)); 
</script> 
%} 
* @param {Array} a 集合A 
* @param {Array} b 集合B 
* @returns {Array} 两个集合的补集 
*/ 
Array.complement = function(a, b){ 
return Array.minus(Array.union(a, b),Array.intersect(a, b)); 
}; 

/** 
* 求两个集合的交集 
{%example 
<script> 
var a = [1,2,3,4]; 
var b = [3,4,5,6]; 
alert(Array.intersect(a,b)); 
</script> 
%} 
* @param {Array} a 集合A 
* @param {Array} b 集合B 
* @returns {Array} 两个集合的交集 
*/ 
Array.intersect = function(a, b){ 
return a.uniquelize().each(function(o){return b.contains(o) ? o : null}); 
}; 

/** 
* 求两个集合的差集 
{%example 
<script> 
var a = [1,2,3,4]; 
var b = [3,4,5,6]; 
alert(Array.minus(a,b)); 
</script> 
%} 
* @param {Array} a 集合A 
* @param {Array} b 集合B 
* @returns {Array} 两个集合的差集 
*/ 
Array.minus = function(a, b){ 
return a.uniquelize().each(function(o){return b.contains(o) ? null : o}); 
}; 

/** 
* 求两个集合的并集 
{%example 
<script> 
var a = [1,2,3,4]; 
var b = [3,4,5,6]; 
alert(Array.union(a,b)); 
</script> 
%} 
* @param {Array} a 集合A 
* @param {Array} b 集合B 
* @returns {Array} 两个集合的并集 
*/ 
Array.union = function(a, b){ 
return a.concat(b).uniquelize(); 
};

判断数组是否包含某个元素,可以使用contains,也可以自己定义一个方法,可以灵活来掌握比较的方式,类似于覆盖了java类中的equals方法,举例:

 

 

var objArr = [{ name: 张三, age: 24, sex: 男 }
, { name: 张二, age: 21, sex: 女 }
, { name: 张一, age: 23, sex: 男 }
, { name: 张四, age: 25, sex: 女 }
, { name: 张五, age: 22, sex: 男}];
	
		 Array.prototype.contain=function(obj,props){
			var equals = true;
			for(var i = 0;i < this.length;i++){
				var thisObj = this[i];
				
				for(var j = 0;j < props.length;j++){
					var prop = props[j];
					equals = obj[prop] == thisObj[prop]?true:false;
					if(!equals){
						break;
					}
				}
				if(equals){
						break;
				}
			}
			return equals;
		}
如何判断一个对象是否存在于数组中呢?我们扩展了contain方法,第一个参数是被查询的对象,第二参数是比较的内容(属性数组),比如:要求对象的name和age属性一直的时候就判断其相等:

 

 

var obj = {name: 张五, age: 22, sex: 男};
		var props = [age,name];
		alert(objArr.contain(obj,props));

可以看到,alert返回的是true。

 

更多关于js数组的操作,可以参照博文:http://firepix.iteye.com/blog/1920055

关于jquery操作数组的方法参照博文:http://www.nowamagic.net/jquery/jquery_UseArray.php


 

Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<