`
Blackbaby
  • 浏览: 179719 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics