私は言う文字列を持っています:My Name is %NAME% and my age is %AGE%.
%XXX%
はプレースホルダーです。オブジェクトの値をそこに代入する必要があります。
オブジェクトは次のようになります:{"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}
オブジェクトを解析し、文字列を対応する値に置き換える必要があります。最終出力は次のようになります。
私の名前はマイクで、私の年齢は26です。
全体は、純粋なjavascriptまたはjqueryを使用して実行する必要があります。
元の質問の要件は、文字列補間の恩恵を受けられないことは明らかです。これは、任意の置換キーの実行時処理のように見えるためです。
ただし、、文字列補間を行う必要がある場合は、次を使用できます:
_const str = `My name is ${replacements.name} and my age is ${replacements.age}.`
_
文字列を区切るバックティックに注意してください、それらは必須です。
特定のOPの要件に合った回答を得るには、置換にString.prototype.replace()
を使用できます。
次のコードは、すべての一致を処理し、置換なしで一致するものを処理しません(置換値がすべて文字列である限り、以下を参照してください)。
_var replacements = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"},
str = 'My Name is %NAME% and my age is %AGE%.';
str = str.replace(/%\w+%/g, function(all) {
return replacements[all] || all;
});
_
jsFiddle 。
置換の一部が文字列ではない場合、最初にオブジェクトに存在することを確認してください。例のような形式、つまりパーセント記号でラップされている場合は、in
演算子を使用してこれを実現できます。
jsFiddle 。
ただし、形式に特別な形式、つまり文字列がなく、置換オブジェクトにnull
プロトタイプがない場合は、Object.prototype.hasOwnProperty()
を使用します。ただし、置き換えられる可能性のある部分文字列は、プロトタイプのプロパティ名と衝突します。
jsFiddle 。
それ以外の場合、置換文字列が_'hasOwnProperty'
_であれば、結果として文字列が乱れます。
jsFiddle 。
補足として、replacements
ではなく、Object
とArray
を呼び出す必要があります。
ES6テンプレートリテラルを使用してはどうですか?
var a = "cat";
var b = "fat";
console.log(`my ${a} is ${b}`); //notice back-ticked string
JQuery(jquery.validate.js)を使用して、簡単に機能させることができます。
$.validator.format("My name is {0}, I'm {1} years old",["Bob","23"]);
または、その機能だけを使用する場合は、その機能を定義して、次のように使用できます。
function format(source, params) {
$.each(params,function (i, n) {
source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
})
return source;
}
alert(format("{0} is a {1}", ["Michael", "Guy"]));
jquery.validate.jsチームの功績
最新のブラウザと同様に、プレースホルダは、Cスタイル関数printf()
と同様に、新しいバージョンChrome/Firefoxでサポートされています。
プレースホルダー:
%s
文字列。%d
、%i
整数。%f
浮動小数点数。%o
オブジェクトハイパーリンク。例
console.log("generation 0:\t%f, %f, %f", a1a1, a1a2, a2a2);
ところで、出力を見るには:
Ctrl + Shift + J
またはF12
を使用して開発者ツールを開きます。Ctrl + Shift + K
を使用して開発者ツールを開きます。 (今後使用されないFirebug
を開くF12
を使用しないでください。コンソールタブにはメッセージが表示されません)。@ Update-nodejsサポート
Nodejsは%f
をサポートしていないようですが、代わりにnodejsで%d
を使用できます。 %d
を使用すると、整数ではなく浮動小数点数として出力されます。
replace()
を使用するだけです
var values = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"};
var substitutedString = "My Name is %NAME% and my age is %AGE%.".replace("%NAME%", $values["%NAME%"]).replace("%AGE%", $values["%AGE%"]);
次のようなカスタム置換関数を使用できます。
var str = "My Name is %NAME% and my age is %AGE%.";
var replaceData = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"};
function substitute(str, data) {
var output = str.replace(/%[^%]+%/g, function(match) {
if (match in data) {
return(data[match]);
} else {
return("");
}
});
return(output);
}
var output = substitute(str, replaceData);
ここで動作することを確認できます: http://jsfiddle.net/jfriend00/DyCwk/ 。
実行時にes6テンプレートリテラルを動的に使用して、これを行う別の方法を次に示します。
const str = 'My name is ${name} and my age is ${age}.'
const obj = {name:'Simon', age:'33'}
const result = new Function('const {' + Object.keys(obj).join(',') + '} = this.obj;return `' + str + '`').call({obj})
document.body.innerHTML = result
%sプレースホルダーを次のように置き換えるなど、console.logに近い何かをしたい場合
>console.log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright")
>Hello Loreto how are you today is everything allright?
これを書いた
function log() {
var args = Array.prototype.slice.call(arguments);
var rep= args.slice(1, args.length);
var i=0;
var output = args[0].replace(/%s/g, function(match,idx) {
var subst=rep.slice(i, ++i);
return( subst );
});
return(output);
}
res=log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright");
document.getElementById("console").innerHTML=res;
<span id="console"/>
あなたは得るでしょう
>log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright")
>"Hello Loreto how are you today is everything allright?"
[〜#〜] update [〜#〜]
文字列変換を扱うときに便利なString.prototype
として簡単なバリアントを追加しました。ここにあります:
String.prototype.log = function() {
var args = Array.prototype.slice.call(arguments);
var rep= args.slice(0, args.length);
var i=0;
var output = this.replace(/%s|%d|%f|%@/g, function(match,idx) {
var subst=rep.slice(i, ++i);
return( subst );
});
return output;
}
その場合はあなたがします
"Hello %s how are you %s is everything %s?".log("Loreto", "today", "allright")
"Hello Loreto how are you today is everything allright?"
このバージョンをお試しください こちら
これにより、まさにそれを行うことができます
NPM: https://www.npmjs.com/package/stringinject
GitHub: https://github.com/tjcafferkey/stringinject
以下を行うことにより:
var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" });
// My username is tjcafferkey on Git
簡単な例として:
var name = 'jack';
var age = 40;
console.log('%s is %d yrs old',name,age);
出力は次のとおりです。
ジャックは40歳です