代码之家  ›  专栏  ›  技术社区  ›  Alec Smart

JQuery不相交

  •  4
  • Alec Smart  · 技术社区  · 16 年前

    我有两个数组:

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

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

    我知道一种方法是对每种方法进行迭代,但是是否有更有效的方法?

    谢谢你抽出时间。

    4 回复  |  直到 16 年前
        1
  •  5
  •   samjudson    16 年前

    您可以尝试以下操作:

    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);
    
        2
  •  1
  •   Sampson    16 年前

    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
  •  1
  •   Gumbo    16 年前

    您必须查看两个数组中的每个元素,才能得到它们的区别。因此,除了迭代两个数组之外,没有其他方法:

    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
  •  0
  •   Kobi    16 年前

    你可以先把它们分类( a.sort() ,然后是一个简单的迭代。