2009-06-11 6 views
4

J'ai deux tableaux:jQuery disjoints

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

Je veux savoir quels sont les éléments dans le tableau a mais pas dans tableau b et quels éléments sont en b mais pas dans a?

Je sais que l'un des moyens consiste à parcourir chacun d'entre eux, mais y a-t-il un moyen plus efficace?

Nous vous remercions de votre temps.

Répondre

5

Vous pouvez essayer ce qui suit:

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

Vous pouvez définir cela comme une fonction 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

excellent travail samjudson. Vraiment bonne et très courte solution du problème. – Bakhtiyor

+0

ne fonctionne pas pour le cas var a = new Array (1,2); var b = new Tableau (2); – Thariama

+0

La raison en est que crée deux tableaux, a contient 1 et 2, mais b est un tableau vide de taille 2. – samjudson

0

vous pouvez les trier d'abord (a.sort()), puis c'est une simple itération.

1

Vous devez regarder chaque élément à la fois tableau pour obtenir la différence d'entre eux. Donc, il n'y a pas d'autre moyen que itérer à la fois tableau:

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

Vous pouvez sauter certaines comparaisons lorsque les tableaux sont triés et commencer par la boucle interne avec l'élément après le dernier match et casser si la valeur est plus grande: Mais le tri des deux tableaux coûte également.

1

La fonction in_array() de PHP était ported to Javascript il y a quelque temps. Je l'ai utilisé de temps en temps. De plus, la fonction array_diff() était également 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; 
}