jQuery不相交

时间:2009-06-11 10:02:54

标签: javascript jquery arrays

我有两个数组:

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

我想找出数组a但数组b中的哪些元素以及哪些元素位于b而不是a

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

感谢您的时间。

4 个答案:

答案 0 :(得分:5)

您可以尝试以下方法:

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);

答案 1 :(得分:1)

你必须查看两个数组的每个元素以获得它们的不同。因此除了迭代两个数组之外别无他法:

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;
};

但是对两个阵列进行排序也会产生费用。

答案 2 :(得分:1)

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 :(得分:0)

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