js获取数组的交集(补集)

1、(不推荐)刚开始写的时候使用如下的函数

function arrayIntersection ( a, b )

{

    var ai=0, bi=0;

    var result = new Array();

    while ( ai < a.length && bi < b.length )

    {

        if      ( a[ai] < b[bi] ) { ai++; }

        else if ( a[ai] > b[bi] ) { bi++; }

        else /* they're equal */

        {

            result.push ( a[ai] );

            ai++;

            bi++;

        }

    }

    return result;

}       //调用var $result = arrayIntersection (m,touResult);
解释:这是网上找到的一段代码,可以找出一部分相同的元素,但不是所有的,其中的原因就在于里面的if判断过程中,会漏掉里面的相同的元素,比如说a数组里面的元素都比b数组里面的第一个元素小,那么这个循环就不会遍历到b数组,最终得到的相同元素就是null

2、因为马上放假,不愿意动脑,就上网又开始找到了一些代码,完美实现效果

Array.prototype.contains = function(obj) {

    var i = this.length;

    while (i--) {

        if (this[i] === obj) {

            return true;

        }

    }

    return false;

}                 //array扩展出来的contains的方法,写上以后可以直接调用;

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;

};                    //array扩展出来的each方法

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;

};                    //array扩展出来的uniquelize方法

Array.intersect = function(a, b){

    return a.uniquelize().each(function(o){return b.contains(o) ? o : null});

};                    //实现数组的交集

用的时候可以如下:

var $result = Array.intersect(touResult,m);      完美实现呀
求补集的时候可以:

Array.complement = function(a, b){
return Array.minus(Array.union(a, b),Array.intersect(a, b));
}; 

求差集的时候可以:

Array.minus = function(a, b){
return a.uniquelize().each(function(o){return b.contains(o) ? null : o});
}; 

求并集的时候可以:

Array.union = function(a, b){
return a.concat(b).uniquelize();
};



十个赞

转载于:https://my.oschina.net/leonaLily/blog/396746

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值