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 ?

198voto

user460084 Points 152

Simplement en ES6

const a1 = ["a", "b", "c", "t"];
const a2 = ["d", "a", "t", "e", "g"];

console.log( a2.filter(x => !a1.includes(x)) );

(une autre option est a2.filter(x => a1.indexOf(x)===-1) )

78voto

Réponse tardive avec le nouveau javascript ECMA5 :

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

myArray = y.filter( function( el ) {
  return x.indexOf( el ) < 0;
});

18voto

Matthew Flaschen Points 131723
var z = $.grep(y, function(el){return $.inArray(el, x) == -1}); 

Aussi, le nom de la méthode est trop court pour son propre bien. Je m'attends à ce qu'il signifie isElementInArray, pas indexOf.

Pour une démo avec des objets, voir http://jsfiddle.net/xBDz3/6/

15voto

Matt Woelk Points 345

Voici une alternative en utilisant underscore.js:

function inAButNotInB(A, B) {
  return _.filter(A, function (a) {
    return !_.contains(B, a);
  });
}

12voto

AhmerMH Points 358

Je suis assez en retard maintenant, mais cela pourrait être utile pour quelqu'un.

Si le tableau n'est pas juste un simple tableau mais un tableau d'objets, alors ce qui suit peut être utilisé :

var arr1 = [
    {
      "prop1": "valeur1",
      "prop2": "valeur2",
    },
    {
      "prop1": "valeur3",
      "prop2": "valeur4",
    },
    {
      "prop1": "valeur5",
      "prop2": "valeur6",
    },
  ];

var arr2 = ['valeur1','valeur3', 'nouvelleValeur'];

// trouve tous les éléments de arr2 qui ne sont pas dans arr1
arr2.filter( 
    val => !arr1.find( arr1Obj => arr1Obj.prop1 === val)
); // affiche "nouvelleValeur"

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