javascript数组扩展

Object.prototype.equals = function (x) { 
    if (!x) { 
        return false; 
    } 
    for (var p in this) { 
        if (typeof(x[p]) == 'undefined') { 
            return false; 
        } 
    } 
    for (var p in this) { 
        if (this[p]) { 
            switch (typeof(this[p])) { 
            case 'object': 
                if (!this[p].equals(x[p])) { 
                    return false 
                }; 
                break; 
            case 'function': 
                if (typeof(x[p]) == 'undefined' || (p != 'equals' && this[p].toString() != x[p].toString())) { 
                    return false; 
                }; 
                break; 
            default: 
                if (this[p] != x[p]) { 
                    return false; 
                } 
            } 
        } else { 
            if (x[p]) { 
                return false; 
            } 
        } 
    } 

    for (p in x) { 
        if (typeof(this[p]) == 'undefined') { 
            return false; 
        } 
    } 
    return true; 
} 

Array.prototype.contains=function(a){ 
    var b=this; 
    for(var i=0;i<b.length;i++){ 
         if(a.equals(b[i])) return true; 
    } 
    return false; 
} 


/** 
* 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){ 
     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(); 
}; 

 

原文链接:http://bbs.51js.com/viewthread.php?tid=88229

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值