116 votes

Algorithme Javascript pour trouver des éléments dans un tableau qui ne sont pas dans un autre tableau

Je suis à la recherche d'un bon algorithme pour obtenir tous les éléments dans un tableau qui ne sont pas des éléments dans un autre tableau. Donc, étant donné ces tableaux :

var x = ["a","b","c","t"];
var y = ["d","a","t","e","g"];

Je veux obtenir ce tableau :

var z = ["d","e","g"];

Je utilise jquery, donc je peux profiter de $.each() et $.inArray(). Voici la solution que j'ai trouvée, mais il semble qu'il devrait y avoir une meilleure façon.

// le but est de se débarrasser des valeurs de y si elles existent dans x
var x = ["a","b","c","t"];
var y = ["d","a","t","e","g"];

var z = [];
$.each(y, function(idx, value){
  if ($.inArray(value,x) == -1) {
    z.push(value);
  }
});
alert(z);  // devrait être ["d","e","g"]

Voici le code en action. Des idées ?

4voto

Mogsdad Points 11078

Ceci est une réponse tardive, mais elle n'utilise aucune bibliothèque, donc certains pourraient la trouver utile.

/**
 * Retourne un Array non destructif des éléments qui ne sont pas présents dans
 * aucun des tableaux de paramètres.
 *
 * @param {...Array} var_args   Tableaux à comparer.
 */
Array.prototype.uniqueFrom = function() {
  if (!arguments.length)
    return [];
  var a1 = this.slice(0); // Commence par une copie

  for (var n=0; n < arguments.length; n++) {
    var a2 = arguments[n];
    if (!(a2 instanceof Array))
      throw new TypeError( 'argument ['+n+'] doit être un tableau' );

    for(var i=0; i -1) {
        a1.splice(index, 1);
      } 
    }
  }
  return a1;
}

Exemple:

var sheetUsers = ['joe@example.com','fred@example.com','sam@example.com'];
var siteViewers = ['joe@example.com','fred@example.com','lucy@example.com'];
var viewersToAdd = sheetUsers.uniqueFrom(siteViewers);  // [sam@example.com]
var viewersToRemove = siteViewers.uniqueFrom(sheetUsers);  // [lucy@example.com]

3voto

Yoav Schniederman Points 1882
findDiff = (A, B) => {
     retourner  A.filter(function (a) {
          retourner !B.includes(a);
     });
 }

2voto

drawnonward Points 35444

Procédez d'abord à des copies triées des tableaux. Si les éléments supérieurs sont égaux, supprimez-les tous les deux. Sinon, supprimez l'élément le moins élevé et ajoutez-le à votre tableau de résultat. Si un tableau est vide, ajoutez le reste de l'autre tableau au résultat et terminez. Vous pouvez parcourir les tableaux triés au lieu de supprimer des éléments.

// supposez que x et y sont triés
xi = 0; yi = 0; xc = x.length; yc = y.length;
while (xi < xc && yi < yc) {
  if (x[xi] == y[yi]) {
    xi += 1;
    yi += 1;
  } else if (x[xi] < y[yi]) {
    z.push(x[xi]);
    xi += 1;
  } else {
    z.push(y[yi]);
    yi += 1;
  }
}
// ajoutez le reste de x et y à z. l'un ou l'autre sera vide.

1voto

Koobz Points 4224

Peut-être que jLinq peut vous aider?

Il vous permet d'exécuter des requêtes comme celle-ci sur des objets javascript.

Par exemple:

var users = [ { name: "jacob", age: 25 },  { name: "bob" , age: 30 }]
var additionalusers = [ { name: "jacob", age: 25 },  { name: "bill" , age: 25 }]

var newusers = jLinq.from(users).except(additionalusers).select();

>>> newusers = [ { name: "bob" , age: 30 } ]

C'est un peu trop pour vous pour le moment, mais c'est une solution robuste que j'ai été heureux de découvrir.

Il peut faire des intersections, des unions, gérer la logique booléenne et toute sorte de bonté linq.

0voto

KyleMit Points 6937

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X