2016-07-29 5 views
-1

私は関数にURLやアイテムを渡す/endpoint/123/disable/lorem/endpoint/{item.id}/disable/{item.name}に代わるソリューション内部の一般的な機能を開発しています中にキーを使用してサブストリングに置き換えます。JSオブジェクト

アイテムがキーidname持つオブジェクトであろう。

{item.KEY}という構造のアイテムを見つけて、item.KEYに置き換えるにはどうすればよいでしょうか?

+0

あなたが「構造」を言うとき、あなたは「意味ですかサブ文字列 "? –

+0

@ this-vidor正確に、申し訳ありません、正しい言葉を忘れました –

+0

[テンプレートリテラル](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) – Andreas

答えて

1

を。 私は

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/

+0

ありがとう、それは私が探していたものです。 –

+0

あなたは大歓迎です! – Wolfgang

+0

ifの定義[key]またはdefinition.hasOwnProperty(key)を使用する必要がありますか? –

1

あなたは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. 
}); 
+0

これは**正確には 'eval'を使うのが超危険な状況のようです。これらの文字列がどこから来ているにせよ、それらは消毒されていない可能性が高い。 –

+0

はるかに安全な溶液は 'path.splitを供給することであろう(「」)[1]' 'item'オブジェクトへのキーとして。 :)解決策の中で 'eval'を避けるなら、投票を下げるように投票を変更します。 –

+0

@ this-vidor:ok、done。 –

関連する問題