jQuery 不相交

Posted

技术标签:

【中文标题】jQuery 不相交【英文标题】:jQuery Disjoint 【发布时间】:2010-11-02 02:13:04 【问题描述】:

我有两个数组:

var a = new Array(1,2,3,4);
var b = new Array(5,3,2,6);

我想找出哪些元素在数组a 中但不在数组b 中,哪些元素在b 中但不在a 中?

我知道一种方法是遍历它们,但是有没有更有效的方法?

感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

您可以尝试以下方法:

var aNotInB = $.grep(a, function($e)  return $.inArray($e, b) == -1; );
var bNotInA = $.grep(b, function($e)  return $.inArray($e, a) == -1; );

您可以将其定义为 jquery 函数:

$.disjoin = function(a, b) 
    return $.grep(a, function($e)  return $.inArray($e, b) == -1; );
;

var aNotInB = $.disjoin(a,b);
var bNotInA = $.disjoin(b,a);

【讨论】:

干得好 samjudson。问题的真正好和非常短的解决方案。 不适用于这种情况 var a = new Array(1,2); var b = new Array(2); 这样做的原因是创建了两个数组,a包含1和2,但是b是一个大小为2的空数组。【参考方案2】:

php 的 in_array() 函数是 ported to javascript 前一段时间。我不时使用它。此外,array_diff() 函数也是ported over。

function in_array(needle, haystack, argStrict) 
    // http://kevin.vanzonneveld.net 
    var key = '', strict = !!argStrict;

    if (strict) 
        for (key in haystack) 
            if (haystack[key] === needle) 
                return true;
            
        
     else 
        for (key in haystack) 
            if (haystack[key] == needle) 
                return true;
            
        
    

    return false;


function array_diff() 
    // *     example 1: array_diff(['Kevin', 'van', 'Zonneveld'], ['van', 'Zonneveld']);
    // *     returns 1: ['Kevin']
    var arr1 = arguments[0], retArr = ;
    var k1 = '', i = 1, k = '', arr = ;

    arr1keys:
    for (k1 in arr1) 
        for (i = 1; i < arguments.length; i++) 
            arr = arguments[i];
            for (k in arr) 
                if (arr[k] === arr1[k1]) 
                    // If it reaches here, it was found in at least one array, so try next value
                    continue arr1keys; 
                
            
            retArr[k1] = arr1[k1];
        
    

    return retArr;

【讨论】:

【参考方案3】:

您必须查看两个数组的每个元素以了解它们的区别。所以除了迭代两个数组别无他法:

Array.prototype.diff = function(otherArray) 
    var diff = [], found;
    for (var i=0; i<this.length; i++) 
        found = false;
        for (var j=0; j<otherArray.length; j++) 
            if (this[i] == otherArray[j]) 
                found = true;
                break;
            
        
        if (!found) 
            diff.push(this[i]);
        
    
    return diff;
;

var a = [1,2,3,4],
    b = [5,3,2,6];
var aDiffB = a.diff(b),
    bDiffA = b.diff(a);

您可以在数组排序时跳过一些比较,并从最后一次匹配后的元素的内部循环开始,如果值较大则将其中断:

Array.prototype.diff = function(otherArray) 
    var diff = [], found, startAt = 0,
        a = this.sort(),
        b = otherArray.sort();
    for (var i=0; i<a.length; i++) 
        found = false;
        for (var j=startAt; j<b.length; j++) 
            if (a[i] > b[j]) 
                break;
            
            if (a[i] == b[j]) 
                found = true;
                startAt = j + 1;
                break;
            
        
        if (!found) 
            diff.push(a[i]);
        
    
    return diff;
;

但是对两个数组进行排序也需要花费。

【讨论】:

【参考方案4】:

您可以先对它们进行排序 (a.sort()),然后进行简单的迭代。

【讨论】:

以上是关于jQuery 不相交的主要内容,如果未能解决你的问题,请参考以下文章

jquery函数通过相同的元素相交数组[重复]

有没有办法让jQuery中的选择器相交[重复]

为 jQuery UI Droppable 的相交容差构建匹配选项

增强几何返回相交和相交的不一致结果

Python入门教程第51篇 不相交集

160. 相交链表