2016-12-23 12 views
4

私は、値がメンバ名に依存するようにjavascriptオブジェクトのコンテンツの作成を容易にするために、このような何かしようとしています:JavaScriptオブジェクト:プロパティ名の後方参照

var obj = { 
    1: "you selected 1", 
    2: "wow, you selected 2", 
    3: "this time, you selected " + myName(), //myName() gets resolved to 3 
    137: "I think you've chosen " + myName() + " this time.", //myName() gets resolved to 137 
    513: myName() + " is the answer!" //myName() gets resolved to 513 
}; 

が可能でメンバーを後方参照するということです値の定義に名前、想定される関数のようなものを使用するmyName()

ネイティブメソッドが存在しない場合は、これを実行するための推奨方法は何ですか?

「この男はなぜこのようなオブジェクトを生成するにはどうすればいいのですか?」、答えは:私のコードでは、メンバ/フィールド名が変更され、デフォルト値がコピーされ、唯一の違いはメンバー名への参照であるため、各キー値に数値を定義したくありませんしたがって、私は値の定義の中で名前を逆参照する方法の後にいます。あなたはES6機能を探している

+1

だから、基本的にはあなたのオブジェクトのキーをその価値のものにしたいのですか? 'obj = {" dave ":"私の名前は "+ key}"のようなものはここでdaveに解決されます。 –

+0

はい、値をキーを取得できるようにします。 'キー'は同じキーワードになりますが、異なるキーを持つ値には異なる数字が返されます。 –

+0

私は "@ key @"のような特別な文字列を使用して後で置き換えようと考えていましたが、文字列 '@ key @'を値に使用してコードの挿入 –

答えて

1

Proxy

Proxyオブジェクトは、基本的な操作のためのカスタム動作(例えば不動産検索、割り当て、列挙、関数呼び出しなど)を定義するために使用されます。

そして、実際のキーとpropを取り、実際のキーとプレースホルダー{key}を交換してください。結局のところ

var obj = { 
 
     1: "you selected {key}", 
 
     2: "wow, you selected {key}", 
 
     3: "this time, you selected {key}", 
 
     137: "I think you've chosen {key} this time.", 
 
     513: "{key} is the answer!" 
 
    }, 
 
    p = new Proxy(obj, { 
 
     get: function(target, prop) { 
 
      return target[prop] && target[prop].replace("{key}", prop); 
 
     } 
 
    }); 
 

 
console.log(p[3]);   // this time, you selected 3 
 
console.log(p[137]);  // I think you've chosen 137 this time. 
 
console.log(p[513]);  // 513 is the answer! 
 
obj.foo = 'This is {key}!'; // create new property foo 
 
console.log(p.foo);   // This is foo! 
 
obj.bar = obj.foo;   // assign foo to bar 
 
delete obj.foo;    // delete foo 
 
console.log(p.foo);   // undefined 
 
console.log(p.bar);   // This is bar!

+1

私はプロキシの利点を理解できませんでした。代わりに仕事をするように見えます。解決策は、 "{key}"部分文字列を予約します。文字列を予約する代わりにコードにエスケープできる解決策がない場合、私はあなたに同意します。 –

+0

@EduardoPoçoでは、プロキシは呼び出されたプロパティの名前にアクセスできます。 –

+0

ああ、今見ましたが、値が要求されたときに置換が行われます。元のオブジェクトには部分文字列「{key}」が残されているため、プロキシを介してオブジェクトにアクセスする外部コードだけが置換を参照します。だから、その名前はプロキシです! –

0

誰かがまだ関心がある場合、私は、私の願望を達成する方法を考え出しました。

文字列の代わりに値に関数を使用しました。関数は、関数に従って評価され、必要な場所のキーを使用して値を返します。だから、次のようになります。

var obj = { 
    1: function(key){return "you selected 1";}, 
    2: function(key){return "wow, you selected 2";}, 
    3: function(key){return "this time, you selected " + key;}, 
    137: function(key){return "I think you've chosen " + key + " this time.";}, 
    513: function(key){return key + " is the answer!";} 
}; 

function getValue(key) { 
    return obj[key](key); 
} 

値、使用を呼び出すには:OP(自分が)これとパラノイアであるとして文字列が、置き換えのために予約されていない

var value = getValue(137); 

関連する問題