2016-08-17 15 views
0

私はこのコードがあるとします。Javascriptを:コード文字列を変換し、バック

var cfg = { 
    config: { 
    fields: { 
     name: { 
     type: 'text' 
     }, 
     age: { 
     type: 'number' 
     } 
    }, 
    actions: [ 
     { 
     label: 'Print', 
     cb: (model) => { 
      console.log(model); 
     } 
    } 
    ] 
    }, 
    data: {name: 'Jhon', age: 23} 
} 

をそして、私はそれを文字列に変換する(ユーザーの編集、それをできるように)してから戻って実行可能なコードに変換し、どのようにこれを達成するための任意のアイデアですか?

私はJSON.stringifyJSON.parseで試しましたが、それはもちろん機能を削除します。 .toString"[object Object]"を返します。オブジェクトを反復し、値が文字列、関数、または数値の場合は.toStringを呼び出してください。他の考えですか?

+2

あなたが本当に必要なのですあなたのユーザーは機能を編集する? – Bergi

+0

はい、私はそれを使用する方法とUIのcomponentiの図形のチュートリアルですので、私はいくつかのコードを記述して実行する必要があります – teone

+0

その後、オブジェクトではなく、文字列で開始する必要があります。前後に変換しないでください。文字列にのみ 'eval'を使用してください。初期コードの場合は、文字列リテラルに入れるか、ファイルからロードします。 – Bergi

答えて

0

あなたはそうevalを行い、カップル他、そのオブジェクトの周りに反復処理し、Functionコンストラクタは、文字列としてのコードをとり、この

for (var key in cfg.config.fields) { 
    console.log(key, cfg.config.fields[key].type); 
    console.log(key, cfg.data[key],'data'); 
    console.log('<input type="'+cfg.config.fields[key].type+'" value="'+cfg.data[key]+'">') 
} 
+0

はい、それは私が従う方法です...実際には少し複雑ですが、私たちは構造を知りませんが、再帰的な関数がそのトリックを作りました。すぐに投稿します。 – teone

1

のように、要素を入力するように設定することができます。ただし、何らかの理由で回避できない場合は、セキュリティ上の懸念、デバッグ機能、およびそうしたときに実行できる他の多くの問題のために、コードを文字列および後ろに変換しないでください。

コードを文字列に変換することは、変数を再宣言しないようにする必要があり、新しいコンテキストのすべてが構文的に正しいことを確認する必要があるため、やや面倒です。後でevalに与えられているため、objfプロパティが再度宣言されていることに注意してください。evalは、名前が必要なグローバルスコープに配置されます。

let obj = { f: function f() { let stuff = "hi"; console.log("hi"); } }; 
 
let code = obj.f.toString(); 
 
console.log(code); 
 
eval(code); 
 
f();

JSON.stringifyプロセスをカスタマイズするために使用することができる任意replacerパラメータを有することに留意されたいです。

可能であれば、文字列変換とのコードのやりとりを避けることを強く推奨します。通常のケースでは、これは必要ではないため、行うべきではありません。

+0

このケースでは、制御された環境でのチュートリアルなので、セキュリティ上の問題はありません – teone

0

これは私が思い付いたソリューションです:あなたは、これはランダムなJS構造(オブジェクトや配列を含むオブジェクト)内のすべてのプロパティ間で再帰的に反復ANの文字列を含む対応する構造を返します

const toString = (code) => { 
    if(Array.isArray(code)){ 
    return code.map(item => toString(item)); 
    } 
    else if(typeof code == 'object'){ 
    let tmp = {}; 
    Object.keys(code).forEach(key => { 
     tmp[key] = toString(code[key]) 
    }); 
    return tmp; 
    } 
    else{ 
    return code.toString().split('\n').join('').replace(/ +(?=)/gmi, ''); 
    } 
}; 

実際の文字列を取得するのにJSON.stringifyを使用できます。

ユーザーがそれを編集した後、それがで実行されます。他で指摘したように

eval(`(${string})`); 

evalを使用して注意してください、それは危険なことができます(興味深い記事がhttps://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/ある)

関連する問題