扩展你的javascript数组

本文深入探讨了JavaScript中数组的各种操作方法,包括交集、并集、差集和补集等高级功能。通过具体实例展示了如何利用这些方法进行高效的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在做的项目用的正是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;   
};   
  
/**  
* 得到一个数组不重复的元素集合<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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值