Auf dem angegebenen Array:

const arr = [
  { fn: "Steve", ln: "Jobs" },
  { fn: "Dennis", ln: "Rodman" },
  { fn: "Karl", ln: "Malone" },
  { fn: "Vince", ln: "Carter" },
  { fn: "Steve", ln: "King" }
];

Wenn ich ein neues Array mit Ausnahme von Steve zurückgeben möchte, könnte ich Folgendes ausführen:

const filteredArr = arr.filter(obj => obj.fn != "Steve");

Wie kann ich ohne Verwendung von toLowerCase() eine Regex schreiben, um das gleiche Ergebnis zu erzielen, wenn Steve-Namen in Klein- oder Großbuchstaben geschrieben werden können?

  { fn: "Steve", ln: "Jobs" },
  { fn: "Dennis", ln: "Rodman" },
  { fn: "Karl", ln: "Malone" },
  { fn: "Vince", ln: "Carter" },
  { fn: "steVe", ln: "King" },
  { fn: "STEVE", ln: "Jordan" },
  { fn: "steve", ln: "Clark" },
3
Null isTrue 17 Jän. 2019 im 23:38

3 Antworten

Beste Antwort

Überprüfen Sie die Zeichenfolgen mit RegExp.test() und verwenden Sie die {{ X1}} Flag (Groß- / Kleinschreibung ignorieren) im regulären Ausdruck.

Hinweis: Wenn Sie genaue Übereinstimmungen wünschen, dh Zeichenfolgen ignorieren, die den Namen "steven" enthalten, können Sie ^steve$ verwenden (siehe Grenzen).

const arr = [{"fst":"Steve","snd":"Jobs"},{"fst":"Dennis","snd":"Rodman"},{"fst":"Karl","snd":"Malone"},{"fst":"Vince","snd":"Carter"},{"fst":"steVe","snd":"King"},{"fst":"STEVE","snd":"Jordan"},{"fst":"steve","snd":"Clark"}];

const pattern = /steve/i; // or /^steven$/i
const result = arr.filter(obj => !pattern.test(obj.fst));

console.log(result);

Und Sie können den RegExp-Konstruktor verwenden, um ihn wiederverwendbar zu machen:

const arr = [{"fst":"Steve","snd":"Jobs"},{"fst":"Dennis","snd":"Rodman"},{"fst":"Karl","snd":"Malone"},{"fst":"Vince","snd":"Carter"},{"fst":"steVe","snd":"King"},{"fst":"STEVE","snd":"Jordan"},{"fst":"steve","snd":"Clark"}];

const removeItem = (arr, str, key = 'fst') => {
  const pattern = new RegExp(str, 'i'); // or new RegExp(`^${str}$`, 'i')

  return arr.filter(obj => !pattern.test(obj[key]));
};

const result = removeItem(arr, 'steve');

console.log(result);
5
Ori Drori 17 Jän. 2019 im 20:49
const arr = [
  { fn: "Steve", ln: "Jobs" },
  { fn: "Dennis", ln: "Rodman" },
  { fn: "Karl", ln: "Malone" },
  { fn: "Vince", ln: "Carter" },
  { fn: "Steve", ln: "King" }
];

const filteredArr = arr.filter(obj => !/Steve/i.test(obj.fn));

console.log(filteredArr);

Das i Regex-Flag können Sie die Ergebnisse unabhängig von der Großschreibung (Groß- / Kleinschreibung) abgleichen.

2
Itai Steinherz 17 Jän. 2019 im 21:01

Warum nicht .localeCompare (compareString [, locales [, Optionen]])?

Die Methode localeCompare () gibt eine Zahl zurück, die angibt, ob eine Referenzzeichenfolge vor oder nach der angegebenen Zeichenfolge in Sortierreihenfolge steht oder mit dieser übereinstimmt.

In den Optionen können Sie die Empfindlichkeit einstellen:

"Akzent": Nur Zeichenfolgen, die sich in Basisbuchstaben oder Akzenten und anderen diakritischen Zeichen unterscheiden, werden als ungleich verglichen. Beispiele: a ≠ b, a ≠ á, a = A.

const arr = [
  { fn: "Steve", ln: "Jobs" },
  { fn: "Dennis", ln: "Rodman" },
  { fn: "Karl", ln: "Malone" },
  { fn: "Vince", ln: "Carter" },
  { fn: "Steve", ln: "King" }
];

const filteredArr = arr.filter(obj => obj.fn.localeCompare("steve", undefined, 
                                                        { sensitivity: 'accent' }));
console.log(filteredArr);
2
gaetanoM 17 Jän. 2019 im 21:01