Arrays Javascript: supprimez tous les éléments contenus dans un autre tableau

Je cherche un moyen efficace de supprimer tous les éléments d'un réseau javascript s'ils sont présents dans un autre tableau.

// If I have this array: var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; // and this one: var toRemove = ['b', 'c', 'g']; 

Je veux opérer sur myArray pour le laisser dans cet état: ['a', 'd', 'e', 'f']

Avec jQuery, j'utilise grep() et inArray() , ce qui fonctionne bien:

 myArray = $.grep(myArray, function(value) { return $.inArray(value, toRemove) < 0; }); 

Existe-t-il un mode javascript pur pour le faire sans boucle et épissure?

Utilisez la méthode Array.filter() :

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

Une petite amélioration, en tant que support du navigateur pour Array.includes() a augmenté:

 myArray = myArray.filter( function( el ) { return !toRemove.includes( el ); } ); 

Cela devrait faire l'affaire:

 var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; var toRemove = ['b', 'c', 'g']; myArray = myArray.filter(function(x) { return toRemove.indexOf(x) < 0 }) 

Si vous utilisez un ensemble d'objets. Ensuite, le code ci-dessous devrait faire la magie, où une propriété d'objet sera le critère pour supprimer des éléments en double.

Dans l'exemple ci-dessous, les doublons ont été supprimés en comparant le nom de chaque élément.

Essayez cet exemple. http://jsfiddle.net/deepak7641/zLj133rh/

 var myArray = [ {name: 'deepak', place: 'bangalore'}, {name: 'chirag', place: 'bangalore'}, {name: 'alok', place: 'berhampur'}, {name: 'chandan', place: 'mumbai'} ]; var toRemove = [ {name: 'deepak', place: 'bangalore'}, {name: 'alok', place: 'berhampur'} ]; for( var i=myArray.length - 1; i>=0; i--){ for( var j=0; j<toRemove.length; j++){ if(myArray[i] && (myArray[i].name === toRemove[j].name)){ myArray.splice(i, 1); } } } alert(JSON.stringify(myArray)); 

Lodash dispose également d'une fonction utilitaire: https://lodash.com/docs#difference

Si vous ne pouvez pas utiliser le nouveau filter ES5, je pense que vous êtes coincé avec deux boucles:

 for( var i =myArray.length - 1; i>=0; i--){ for( var j=0; j<toRemove.length; j++){ if(myArray[i] === toRemove[j]){ myArray.splice(i, 1); } } } 

Je viens d'implémenter comme suit:

 Array.prototype.exclude = function(list){ return this.filter(function(el){return list.indexOf(el)<0;}) } 

Utilisé comme:

 myArray.exclude(toRemove); 

Les ensembles ECMAScript 6 peuvent être utilisés pour calculer les différents éléments de deux tableaux:

 const myArray = new Set(['a', 'b', 'c', 'd', 'e', 'f', 'g']); const toRemove = new Set(['b', 'c', 'g']); const difference = new Set([...myArray].filter((x) => !toRemove.has(x))); console.log(Array.from(difference)); // ["a", "d", "e", "f"] 

Maintenant, dans une saveur unique:

  document.getElementsByTagName("div")[0].innerHTML = ['a', 'b', 'c', 'd', 'e', 'f', 'g'].filter(x => !~['b', 'c', 'g'].indexOf(x)) 
 <div></div>