2009-06-11 2 views
4

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

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

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

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

Спасибо за ваше время.

ответ

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

отличная работа samjudson. Действительно хорошее и очень короткое решение проблемы. – Bakhtiyor

+0

не работает для случая var a = new Array (1,2); var b = новый массив (2); – Thariama

+0

Причина в том, что он создает два массива, содержит 1 и 2, но b представляет собой пустой массив размером 2. – samjudson

0

вы можете сортировать их в первую очередь (a.sort()), а затем это простая итерация.

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

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

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; 
} 
Смежные вопросы