web-dev-qa-db-de.com

Prüfen Sie, ob eine Zeichenfolge ein Element eines Arrays in JavaScript enthält

Wie kann ich überprüfen, ob eine Zeichenfolge ein Element eines Arrays enthält? Ich möchte ein Array filtern, wenn das Element einen String enthält. Bitte sehen Sie den Code unten.

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'Apple'];

  for (var i = 0; i < prohibited.length; i++) {
    if (value.indexOf(prohibited[i]) == -1) {
      return true;
    } else {
      return false;
    }
  }
}

arr = arr.filter(checker);
console.log(arr);

Das Ergebnis ist [ 'Apple', 'kiwi', 'orange' ]. Der 'Apple' sollte entfernt werden, ist es aber nicht. 

Über Code nur "Banane" gefiltert, nicht "Apple". Ich habe viele Suchbegriffe zum Filtern. Gibt es einen einfacheren Weg?

18
Juntae

Das Problem liegt in der for-Schleife, die nur einmal wiederholt wird, da return die Funktion beendet und die for-Schleife im Prozess abschneidet. Sie können den Code also so aktualisieren, dass die Funktion erst dann zurückkehrt, wenn die for-Schleife abgeschlossen ist.

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'Apple'];

  for (var i = 0; i < prohibited.length; i++) {
    if (value.indexOf(prohibited[i]) > -1) {
      return false;
    }
  }
  return true;
}

arr = arr.filter(checker);
console.log(arr);


Um die Funktion zu reduzieren, können Sie die Methoden every() und indexOf() verwenden

Die 'Every'-Methode führt die bereitgestellte Callback-Funktion einmal für jedes Element im Array aus, bis ein Element gefunden wird, bei dem Callback einen falschen Wert zurückgibt (einen Wert, der bei der Konvertierung in einen Boolean-Wert zu "false" wird). Wenn ein solches Element gefunden wird, gibt jede Methode sofort false zurück. Wenn Callback für alle Elemente einen true-Wert zurückgibt, wird jedes true zurückgegeben. Callback wird nur für Indizes des Arrays aufgerufen, denen Werte zugewiesen wurden. Es wird nicht für Indizes aufgerufen, die gelöscht wurden oder denen noch keine Werte zugewiesen wurden. (Von hier genommen)

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'Apple'];
  return prohibited.every(function(v) {
    return value.indexOf(v) == -1;
  });
}

arr = arr.filter(checker);
console.log(arr);


Bei älteren Browsern Option polyfill jeder Methode überprüfen .


Sie könnten hier sogar einen Regex verwenden. Generiere Regex mit Hilfe des Arrays und überprüfe die Übereinstimmung mit test()

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'Apple'];
  var regex = new RegExp(prohibited.map(function(s) {
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
  }).join('|'));
  return !regex.test(value);
}

arr = arr.filter(checker);
console.log(arr);

Verweisen Sie auf diese Antwort für die Konvertierung von String in Regex: Können Sie JavaScript-Regexen mithilfe von String-Variablen im Handumdrehen erstellen?

16
Pranav C Balan

So einfach kann das sein:

const arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

const checker = value =>
  !['banana', 'Apple'].some(element => value.includes(element));

console.log(arr.filter(checker));

ECMAScript 6 FTW!

Die checker verwendet eine Pfeilfunktion .

Der ! bedeutet, dass alle Elemente ausgeschlossen werden, die die Bedingungen nicht erfüllen.

Die Methode some() testet, ob ein Element im Array den von der bereitgestellten Funktion implementierten Test besteht.

aus Array.prototype.some() docs zu MDM

Die Methode includes() bestimmt, ob eine Zeichenfolge in einer anderen Zeichenfolge gefunden werden kann, und gibt entsprechend true oder false zurück.

aus String.prototype.includes() docs zu MDM


Da einige der neuesten ECMAScript-Funktionen nicht in allen Browsern unterstützt werden, sollten Sie Babel verwenden, um Ihren Code in ECMAScript 5 zu kompilieren.

20

Ich denke, das lässt sich stark vereinfachen. Es gibt bereits ein eingebautes Javascript, um diese Dinge zu überprüfen. Erwägen:

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'Apple'];

  // indexOf() returns -1 if the element doesn't exist in the prohibited array
  return prohibited.indexOf( value ) == -1;
}

arr = arr.filter(checker);
console.log(arr);
2
etchesketch

Zum Beispiel, indem Sie ein RegExp erstellen und dagegen testen:

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];
var prohibited = ['banana', 'Apple'];

var escapeForRegex = function(str) {
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};

var r = new RegExp(prohibited.map(escapeForRegex).join("|"));
arr.filter(function(v){ return !r.test(v) });
0
Thomas

Einige mögen argumentieren, dass dies eine fragwürdige Praxis ist, aber es könnte nützlich sein, über eine Methode zu verfügen, die Sie direkt mit der Zeichenfolge ausführen können. In diesem Fall könnten Sie das JavaScript-Objekt Zeichenfolge mithilfe von Zeichenfolge) erweitern .Prototyp

So ...

String.prototype.containsAny = String.prototype.containsAny || function(arr) {
  for (var i = 0; i < arr.length; i++) {
    if (this.indexOf(arr[i]) > -1) {
      return true;
    }
  }
  return false;
};

Wie Sie in diesem Beispiel sehen können, wird standardmäßig eine vorhandene Definition einer containsAny-Methode verwendet. Denken Sie daran: Jedes Mal, wenn Sie eingebaute Objekte erweitern, sollten Sie zuerst die Anwesenheit der Immobilie überprüfen - vielleicht wird es eines Tages existieren .. ¯\_ (ツ) _/¯

Überprüfen Sie diese Geige für die Verwendung oder siehe unten:

var str = 'This is a sentence as a string.';

console.log(str.containsAny(['string1', 'string2', 'string3'])); // -> returns false
console.log(str.containsAny(['string', 'string1', 'string2'])); // -> returns true
<script src="//cdn.simpledigital.net/common/js/extensions/String.prototypeHelpers.js"></script>

0
blizzrdof77