Es ist lustig, denn Stack Overflow hat tatsächlich eine eigene Formatierungsfunktion für die String
Prototyp genannt formatUnicorn
. Versuchen Sie es! Gehen Sie in die Konsole und geben Sie etwas ein wie:
"Hello, {name}, are you feeling {adjective}?".formatUnicorn({name:"Gabriel", adjective: "OK"});
Sie erhalten diese Ausgabe:
Hello, Gabriel, are you feeling OK?
Sie können Objekte, Arrays und Strings als Argumente verwenden! Ich habe seinen Code erhalten und ihn überarbeitet, um eine neue Version von String.prototype.format
:
String.prototype.formatUnicorn = String.prototype.formatUnicorn ||
function () {
"use strict";
var str = this.toString();
if (arguments.length) {
var t = typeof arguments[0];
var key;
var args = ("string" === t || "number" === t) ?
Array.prototype.slice.call(arguments)
: arguments[0];
for (key in args) {
str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]);
}
}
return str;
};
Beachten Sie die clevere Array.prototype.slice.call(arguments)
Aufruf - das heißt, wenn Sie Argumente einwerfen, die Strings oder Zahlen sind, und nicht ein einzelnes Objekt im JSON-Stil, erhalten Sie C#s String.Format
Verhalten fast genau.
"a{0}bcd{1}ef".formatUnicorn("FOO", "BAR"); // yields "aFOObcdBARef"
Das liegt daran, dass Array
's slice
zwingt alles, was in arguments
in eine Array
unabhängig davon, ob es ursprünglich war oder nicht, und die key
ist der Index (0, 1, 2...) jedes Array-Elements, der in eine Zeichenkette umgewandelt wird (z.B. "0", also "\\{0\\}"
für Ihr erstes Regexp-Muster).
Nett.