私は関数にURLやアイテムを渡す/endpoint/123/disable/lorem
で/endpoint/{item.id}/disable/{item.name}
に代わるソリューション内部の一般的な機能を開発しています中にキーを使用してサブストリングに置き換えます。JSオブジェクト
アイテムがキーid
とname
持つオブジェクトであろう。
{item.KEY}
という構造のアイテムを見つけて、item.KEY
に置き換えるにはどうすればよいでしょうか?
私は関数にURLやアイテムを渡す/endpoint/123/disable/lorem
で/endpoint/{item.id}/disable/{item.name}
に代わるソリューション内部の一般的な機能を開発しています中にキーを使用してサブストリングに置き換えます。JSオブジェクト
アイテムがキーid
とname
持つオブジェクトであろう。
{item.KEY}
という構造のアイテムを見つけて、item.KEY
に置き換えるにはどうすればよいでしょうか?
を。 私は
var url = '/endpoint/{id}/disable/{name}'; //I modified your parameters
var definition = { id: 123, name: 'lorem' };
url = url.replace(/{([^}]*)}/g, function (prop) {
var key = prop.substr(1, prop.length - 2);
if (definition[key])
return encodeURIComponent(definition[key]);
else
throw new Error('missing required property "' + key + '" in property collection');
});
//alert(url);
フィドル、必要であれば、あなた自身でこれを変更することができると確信していeasier-マッピングを作るためにあなたのパラメータを変更:https://jsfiddle.net/wovr4ct5/2/
ありがとう、それは私が探していたものです。 –
あなたは大歓迎です! – Wolfgang
ifの定義[key]またはdefinition.hasOwnProperty(key)を使用する必要がありますか? –
あなたはevalを使用しない場合は、多分thisのようなものを使用します。この問題を解決する最良の方法は、正規表現を処理するための関数を渡して
var item = {
id: 123,
KEY: "lorem"
};
function pick(o, s) {
s = s.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
s = s.replace(/^\./, ''); // strip a leading dot
var a = s.split('.');
for (var i = 0, n = a.length; i < n; ++i) {
var k = a[i];
if (k in o) {
o = o[k];
} else {
return;
}
}
return o;
}
、その後
str.replace(/{.*?}/g, function(match){ // match {...}
var path = match.substring(1,match.length-1); // get rid of brackets.
return pick(scope, path); //get value and replace it in string.
});
これは**正確には 'eval'を使うのが超危険な状況のようです。これらの文字列がどこから来ているにせよ、それらは消毒されていない可能性が高い。 –
はるかに安全な溶液は 'path.splitを供給することであろう(「」)[1]' 'item'オブジェクトへのキーとして。 :)解決策の中で 'eval'を避けるなら、投票を下げるように投票を変更します。 –
@ this-vidor:ok、done。 –
あなたが「構造」を言うとき、あなたは「意味ですかサブ文字列 "? –
@ this-vidor正確に、申し訳ありません、正しい言葉を忘れました –
[テンプレートリテラル](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) – Andreas