0

そのようなテンプレート「text %variable.key% text」があります。variable.key は変数です。そして、そのような変数の名前を「text "+variable.key+" text」に変更して、機能させる必要があります。

私はこのようなことをしようとしました:

var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
    return eval('b');
});

ただし、文字列も返します。

誰かがこれを行う方法を教えてもらえますか?

4

4 に答える 4

2

evalまったく使用せずに簡単に実行できます。

function getValue(path) {
    var target = this;
    path.split('.').forEach(function (branch) {
        if (typeof target === "undefined") return;
        target = (typeof target[branch] === "undefined") ? undefined : target[branch];
    });

    return target;
}

から始まるプロパティを取得したい場合は、 をwindow呼び出すだけgetValue("path.to.property")です。他のルート オブジェクトから開始する場合は、 を使用しますgetValue.call(rootObject, "path.to.property")

この関数は、オプションの最初のパラメーターとしてルート オブジェクトを取得するように適合させることもできますが、考え方は同じままです。

実際に見てください

重要:これは Internet Explorer < 9 では動作しArray.prototype.forEachません。あなたはそれを修正することができます

if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(fun /*, thisPointer */) {
        var len = this.length;
        if (typeof fun != "function") throw new TypeError();

        var thisPointer = arguments[1];
        for (var i = 0; i < len; i++) {
            if (i in this) {
                fun.call(thisPointer, this[i], i, this);
            }
        }
    };
}
于 2012-09-19T12:10:43.237 に答える
2

eval() を使用しない別のバリアントは、単純な変数またはオブジェクトで動作します。

var var_name = 'value';

// object
var obj = new Object();
 obj.prop = 'some val';

var tpl = "text %obj.prop% text %var_name% text";
tpl = tpl.replace(/%(.*?)%/gi, function(a,b) {
  var iv = b.split('.');
  return (iv.length == 2) ? window[iv[0]][iv[1]] : window[iv[0]];
});

// test
alert(tpl);
于 2012-09-19T12:14:36.250 に答える
1
var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
    return eval(b);// remove quote.
});

jsfiddle

于 2012-09-19T12:08:20.197 に答える
1

あなたのコードは正しいですがb、ではなくeval する必要があります'b':

var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
    return eval(b);
});

コメントで述べたように、eval を使用するのは適切ではありません。次のように変数値を取得できます。

var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
    return window[b];
});

デモ

于 2012-09-19T12:09:28.480 に答える