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>