zoukankan      html  css  js  c++  java
  • 扩展你的javascript数组

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

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

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

    关于Map的很多其它信息,请參照拙文:http://blog.csdn.net/salerzhang/article/details/41116349

    两个数组的交并补集:

    /** 
    * 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; 
    }; 
    
    /** 
    * 得到一个数组不反复的元素集合<br/> 
    * 唯一化一个数组 
    * @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



  • 相关阅读:
    STM32 之 USB IP(USB模块) 详解(转)
    USB 协议分析之 HID 设备(转)
    Hibernate项目用Maven创建(转)
    eclipse查看hadoop中文件出现乱码
    用spring+hibernate+struts 项目记录以及常用的用法进等
    hibernate之处理视图
    Hadoop组件之-HDFS(HA实现细节)
    hadoop2.x NameNode 的共享存储实现
    Hadoop-2.X HA模式下的FSImage和EditsLog合并过程
    jQuery中读取json文件示例代码
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4359664.html
Copyright © 2011-2022 走看看