jQuery Disjoint - PullRequest
       20

jQuery Disjoint

4 голосов
/ 11 июня 2009

У меня есть два массива:

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

Я хочу выяснить, какие элементы находятся в массиве a, но не в массиве b, а какие элементы находятся в b, но не в a?

Я знаю, что один способ состоит в том, чтобы проходить через них каждый, но есть ли более эффективный способ?

Спасибо, что уделили время.

Ответы [ 4 ]

5 голосов
/ 11 июня 2009

Вы можете попробовать следующее:

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 голос
/ 11 июня 2009

PHP in_array () функция была портирована на Javascript некоторое время назад. Я использовал это время от времени. Кроме того, функция array_diff () была также перенесена на .

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;
}
1 голос
/ 11 июня 2009

Вы должны посмотреть на каждый элемент обоих массивов, чтобы получить их разницу. Так что нет другого способа, кроме как итерировать оба массива:

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

Но сортировка обоих массивов также стоит.

0 голосов
/ 11 июня 2009

вы можете сначала отсортировать их (a.sort()), а затем - простая итерация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...