文字列を変数名に変換するいくつかの方法

2607 ワード

参考:https://segmentfault.com/a/1190000017114522
最初の面接問題:get関数を実現し、次の呼び出しが正しい結果を出力できるようにします.
const obj = { selector: { to: { toutiao: "FE Coder"} }, target: [1, 2, { name: 'byted'}]};

get(obj, 'selector.to.toutiao', 'target[0]', 'target[2].name');
// [ 'FE Coder', 1, 'byted']
簡単に言えば、文字列を変数名に変換するテーマです.
obj.selector.to.toutiao,obj.target[0],obj.target[2].nameは'FE Coder'として出力できますので、1,'byted'ではobj.'selector.to.toutiao',obj.‘target[0],obj.‘target’は出力できますか?明らかにできない
だから、私たちは’selector.to.toutiao’をObj.selector.to.toutiaoに転化すれば完璧に解決できます.
文字列を変数名に変換する方法:
  • 方法1:eval関数を使用する
  • 1.定義:eval()関数は、ある文字列を計算し、JavaScriptコードを実行します.(w 3 c解釈:http://www.w3school.com.cn/jsref/jsref_eval.asp)2.用法:eval(「2+2」)は、4を返します.ps:元の文字列だけをパラメータとして受け入れるということです.
    var xy=4;
    console.log(eval(x+"y"));
    
    エラーを出すことができます.eval(「xy」)ではなく、eval()を使って問題を解く方法です.
    const obj = { selector: { to: { toutiao: "FE Coder"} }, target: [1, 2, { name: 'byted'}]};
      // [ 'FE Coder', 1, 'byted']
      //get(obj, 'selector.to.toutiao', 'target[0]', 'target[2].name');
      function get(obj,x,y,z){
        //        
        x=(eval("obj."+x));
        y=(eval("obj."+y));
        z=(eval("obj."+z));
        console.log(x,y,z);
      }
      get(obj,'selector.to.toutiao','target[0]','target[2].name')
    
  • 方法2:テンプレート文字列`
  • を使用する.
    1.説明:(参考http://es6.ruanyifeng.com/?search=new+function&x=9&y=10菗docs/string)テンプレート文字列に変数を埋め込むには、変数名を${}に書く必要があります.
    2.テンプレート文字列を使った問題解決方法
    function get(data, ...args) {
        const res = JSON.stringify(data);
        return args.map((item) => (new Function(`try {return ${res}.${item} } catch(e) {}`))());
      }
    
      const obj = { selector: { to: { toutiao: "FE Coder"} }, target: [1, 2, { name: 'byted'}]};
      console.log(get(obj, 'selector.to.toutiao', 'target[0]', 'target[2].name', 'asd'));
    
    その他の説明:(1)get(…args):…argsは残りのパラメータ文法であり、一定数のパラメータを一つの配列として表すことができます.(2)JSON.strigify:JSON.strigify()方法は、JavaScript値をJSON文字列に変換するために用いられる.(3)Aray map():メソッドは、元の配列要素の順に要素を処理した後、新しい配列参照を返します.http://www.runoob.com/jsref/jsref-map.html)(4)new Function():(a)new function(arg 1,arg 2,…,argN,functionybaody)のパラメータは必ず文字列(b).new Function()が戻り値を対象とし,function(){)は、関数の値を返します.(newが返されるのは、オブジェクト、newが返されない関数の値(元の開始タイプまたはオブジェクト)です.
    最も重要な総括
    変数名と文字列があり、変数名になりたい場合は、まず文字列に変換します.
    白さんは総括の正しいかどうか分かりません.今の経験でまとめて、いつでも更新します.