2017-07-11 12 views
0

JavaScript式があり、特定のプロパティのすべてのインスタンスを関数に置き換える必要がある場合。たとえば:|「「&」、「(」、「)regexを使用してプロパティを関数に置き換えよう

foo => getFoo() 
a.b.foo => getFoo(a.b) 
a.foo.b => getFoo(a).b 
a.foo.foo => getFoo(getFoo(a)) 
a.foo.b.foo => getFoo(getFoo(a).b) 
a.foo+b.foo||c.foo => getFoo(a)+getFoo(b)||getFoo(c) 
a(b.foo) => a(foo(b)) 

私は終わりを意味するか、されている「」、」特定の変数の開始する文字のチェックを持っている必要があります'、'、 '+'、 ' - '、 '='、 '<'、 '>'

'foo'という文字列を取得した場合、 getFoo()の内部に上記のものがリストされています。

これをどのように実装することができるのか、または正規表現以外の別の方法がより良いアプローチになるかどうか不明ですか?

+0

これはなぜですか? – pirs

+0

私はgetFoo()関数にいくつかのロジックを入力する必要があるため、いくつかの条件を満たす場合にのみfooを返します。そうでなければ何かを返します。 – user2802557

+0

なぜあなたはgetFooオブジェクトを作成して拡張しないでください(浅いコピーを元にするか、プロトタイプ..) – pirs

答えて

1

あなたは&は次のように置き換えるrecusrive見つけることができます:に/(\w+\.)*foo/g:私はから正規表現を変更してい16/09/2017

function replacer(match, params) {     // the match could be 'a.foo.b.c.foo' and params is then 'a.foo.b.c.' 
 
    if(params) params = params.slice(0, -1);   // if there is params, then cut the last '.' out 
 
    return "getFoo(" + parse(params) + ")";   // the parsed version of params wrapped in a getFoo call 
 
} 
 

 
function parse(text) { 
 
    if(!text) return "";        // if text is empty or undefined then return the empty string 
 
    return text.replace(/((?:\w+\.)*)foo/g, replacer); // otherwise match all text before before (a sequence of identifier followed by '.') 'foo' ('a.foo.b.c.foo' the group will be 'a.foo.b.c.') and then use the replacer function to replace the match 
 
} 
 

 
[ 
 
    "foo", 
 
    "a.b.foo", 
 
    "a.foo.b", 
 
    "a.foo.foo", 
 
    "a.foo.b.foo", 
 
    "a.foo+b.foo||c.foo", 
 
    "a(b.foo)", 
 
].forEach(function(t) { 
 
    console.log(t, "=>", parse(t)); 
 
});

更新/((?:\w+\.)*)foo/g最初にグループに一致する問題があります:最後の\w\.のみに一致しますが、すべてではありませんe \w\.\w\.\w\....。最初に答えを投稿したときに働いていたようです。私は答えを掲示したときにそれに気付かなかった。この問題についてさらに読む。here

0

基本的なプロトタイプを使って他のアプローチを試してみてください。希望のようにお互いの機能を「ミックス」するためのプロトタイプを作成することができます。関数内で文字列を変換するよりもプロトタイプ(js prototype) (js string to function):

function Toolbox(name){ 

    this.name = "im "+name; 



    this.a = function(){ 
    return 1; 
    } 

    this.b = function(){ 
    return 2; 
    } 

    this.c = function(){ 
    return this.a + this.b; 
    } 

} 

// create a new Toolbox 
var uniqToolbox = new Toolbox("Julien"); 

// extend 
uniqToolbox.d = function(){ 
    return true; 
} 

alert(uniqToolbox.name); 
+1

コードを書くだけでなく、それが何であるかを説明しようとします。さらに私はそれが質問にどのように関係しているのか分からない – Mistalis

関連する問題