439 Stimmen

Entfernen Sie alle Elemente, die in einem anderen Array enthalten sind

Ich suche nach einer effizienten Möglichkeit, um alle Elemente aus einem JavaScript-Array zu entfernen, wenn sie in einem anderen Array vorhanden sind.

// Wenn ich dieses Array habe:
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];

// und dieses:
var toRemove = ['b', 'c', 'g'];

Ich möchte auf myArray arbeiten, um es in diesem Zustand zu lassen: ['a', 'd', 'e', 'f']

Mit jQuery benutze ich grep() und inArray(), was gut funktioniert:

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

Gibt es eine reine JavaScript-Methode, um dies ohne Schleifen und Aufspalten zu tun?

681voto

Sirko Punkte 71152

Verwenden Sie die Array.filter() Methode:

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

Kleine Verbesserung, da die Browserunterstützung für Array.includes() gestiegen ist:

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

Nächste Anpassung unter Verwendung von Pfeilfunktionen:

myArray = myArray.filter( ( el ) => !toRemove.includes( el ) );

102voto

Benny Neugebauer Punkte 45468

ECMAScript 6 Sets können eine schnellere Berechnung der Elemente eines Arrays ermöglichen, die nicht im anderen enthalten sind:

const myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
const toRemove = new Set(['b', 'c', 'g']);

const difference = myArray.filter( x => !toRemove.has(x) );

console.log(difference); // ["a", "d", "e", "f"]

Da die Suchkomplexität für die V8-Maschine, die von Browsern verwendet wird, heutzutage O(1) beträgt, ist die Zeitkomplexität des gesamten Algorithmus O(n).

75voto

mojtaba roohi Punkte 571
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'}
];

myArray = myArray.filter(ar => !toRemove.find(rm => (rm.name === ar.name && ar.place === rm.place) ))

43voto

Ashwin Balamohan Punkte 3234

Die filter-Methode sollte den Trick tun:

const myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
const toRemove = ['b', 'c', 'g'];

// ES5-Syntax
const filteredArray = myArray.filter(function(x) { 
  return toRemove.indexOf(x) < 0;
});

Wenn dein toRemove-Array groß ist, kann dieses Art von Suchmuster ineffizient sein. Es wäre performanter, eine Map zu erstellen, damit Suchvorgänge mit O(1) anstatt O(n) durchgeführt werden.

const toRemoveMap = toRemove.reduce(
  function(memo, item) {
    memo[item] = memo[item] || true;
    return memo;
  },
  {} // Initialisierung eines leeren Objekts
);

const filteredArray = myArray.filter(function (x) {
  return toRemoveMap[x];
});

// oder, wenn du die ES6-Pfeilfunktionssyntax verwenden möchtest:
const toRemoveMap = toRemove.reduce((memo, item) => ({
  ...memo,
  [item]: true
}), {});

const filteredArray = myArray.filter(x => toRemoveMap[x]);

28voto

Deepak Acharya Punkte 429

Wenn Sie ein Array von Objekten verwenden. Dann sollte der unten stehende Code das Magische tun, wobei eine Objekteigenschaft das Kriterium für das Entfernen von Duplikaten sein wird.

In dem unten stehenden Beispiel wurden Duplikate entfernt, indem der Name jedes Elements verglichen wurde.

Versuchen Sie dieses Beispiel. 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X