Wir schreiben das Jahr 2016 und es gibt keinen klaren Weg, wie man das machen kann? Ich hatte auf ein paar Kopien gehofft. Ich werde es versuchen.
Anmerkungen zum Entwurf: Ich wollte die Speichernutzung minimieren und damit die Geschwindigkeit erhöhen - daher gibt es kein Kopieren/Mutieren von Zeichenketten. Ich nehme an, dass V8 (und andere Engines) diese Funktion optimieren können.
//TODO: Performance testing
String.prototype.naturalIndexOf = function(needle) {
//TODO: guard conditions here
var haystack = this; //You can replace `haystack` for `this` below but I wan't to make the algorithm more readable for the answer
var needleIndex = 0;
var foundAt = 0;
for (var haystackIndex = 0; haystackIndex < haystack.length; haystackIndex++) {
var needleCode = needle.charCodeAt(needleIndex);
if (needleCode >= 65 && needleCode <= 90) needleCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser
var haystackCode = haystack.charCodeAt(haystackIndex);
if (haystackCode >= 65 && haystackCode <= 90) haystackCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser
//TODO: code to detect unicode characters and fallback to toLowerCase - when > 128?
//if (needleCode > 128 || haystackCode > 128) return haystack.toLocaleLowerCase().indexOf(needle.toLocaleLowerCase();
if (haystackCode !== needleCode)
{
foundAt = haystackIndex;
needleIndex = 0; //Start again
}
else
needleIndex++;
if (needleIndex == needle.length)
return foundAt;
}
return -1;
}
Mein Grund für den Namen:
- Sollte IndexOf im Namen haben
- Fügen Sie kein Suffix-Wort hinzu - IndexOf bezieht sich auf den folgenden Parameter. Stellen Sie also stattdessen etwas voran.
- Verwenden Sie nicht "caseInsensitive" Präfix würde sooooo lang sein
- "Natürlich" ist ein guter Kandidat, denn Vergleiche, bei denen die Groß- und Kleinschreibung standardmäßig berücksichtigt wird, sind für den Menschen in erster Linie nicht natürlich.
Warum nicht...:
toLowerCase()
- mögliche wiederholte Aufrufe von toLowerCase für dieselbe Zeichenfolge.
RegExp
- umständlich, mit Variable zu suchen. Sogar das RegExp-Objekt ist umständlich, da es Zeichen entschlüsseln muss
4 Stimmen
Ich denke, dass die Groß-/Kleinschreibung nicht berücksichtigende Regex die elegantere Lösung ist, aber jeder sollte die Fallstricke beim Erstellen einer
RegExp
direkt aus Benutzereingaben. Zum Beispiel könnte ein Benutzer eingeben*
und es würde ein Fehler in derRegExp
Konstrukteur. Bei der akzeptierten Lösung gibt es dieses Problem nicht.