Забавно, потому что Stack Overflow фактически имеет свою собственную функцию форматирования для прототипа String
с именем formatUnicorn
. Попытайся! Зайдите в консоль и наберите что-то вроде:
"Hello, {name}, are you feeling {adjective}?".formatUnicorn({name:"Gabriel", adjective: "OK"});
Вы получите этот вывод:
Hello, Gabriel, are you feeling OK?
Вы можете использовать объекты, массивы и строки в качестве аргументов! Я получил его код и переработал его для создания новой версии 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;
};
Обратите внимание на умный вызов Array.prototype.slice.call(arguments)
- это означает, что если вы добавите аргументы, которые представляют собой строки или числа, а не один объект в стиле JSON, вы получите поведение C # String.Format
почти точно. 1022 *
"a{0}bcd{1}ef".formatUnicorn("foo", "bar"); // yields "aFOObcdBARef"
Это потому, что Array
slice
заставит все, что находится в arguments
в Array
, независимо от того, было это изначально или нет, и key
будет индексом (0, 1, 2 .. .) каждого элемента массива, приведенного к строке (например, «0», поэтому "\\{0\\}"
для вашего первого шаблона регулярного выражения).
Ухоженная.