3

オブジェクトがある場合、このようなもの

var o = {
  test : 1
}

2 番目のオブジェクトが必要です。そのキーの 1 つは o.test の値である必要があります。このようなもの:

var o2 = {
   o.test : "bla"
}

これが不可能であることはわかっていますが、今これを行っているように、より良い(よりクリーンな)方法はありますか?

現在、私がしていることはこれです:

var o2 = {};
o2[o.test] = "bla"

これにはもっと良い方法があると思いますか?

4

3 に答える 3

7

これにはもっと良い方法があると思いますか?

私があなたの質問を正しく理解していると仮定すると、そうではありません。あなたが示した方法は、それを行う方法です。リテラル自体の内部で動的キーを使用する方法はないため、最初に宣言してからプロパティを個別に割り当てる必要があります。

var o2 = {};
o2[o.test] = "bla";

o2; // { 1: "bla" }

アップデート

完全な詳細は仕様に記載されています。オブジェクト リテラル プロパティ識別子の文法は次のとおりです。

PropertyName :
    IdentifierName
    StringLiteral
    NumericLiteral

StringLiteralプロダクションは一目瞭然です。IdentifierNameプロダクションが行うことは次のとおりです。

プロダクションPropertyName : IdentifierNameは次のように評価されます。

  1. IdentifierNameと同じ文字シーケンスを含むString 値を返します。

NumericLiteral プロダクションの場合:

プロダクションPropertyName : NumericLiteralは次のように評価されます。

  1. NumericLiteralの値を形成した結果を nbr とます
  2. ToString ( nbr ) を返します。

このことから、オブジェクト初期化子内で文字列以外のものを使用できないことがわかります。

于 2013-08-20T06:54:09.897 に答える
0

オブジェクトのプロパティは任意の文字列にすることができます

var o = {
  "whatever you want":1,
  "1":"numbers too"
}
o[2]="no numbers, convert to string"

console.log(o["whatever you want"]);//=1
console.log(o["1"]);//=numbers too
console.log(o[new String(2)]);//=no numbers, convert to string
// as James commented, you don't have to convert to string
// I usually do that as to not confuse the object with an array
console.log(o[2]);//=no numbers, convert to string

すべての「プロパティ名」が正の整数または 0 の場合、配列を使用できます。

var arr=new Array();//or var arr=[];
var b=22;
arr[10000]="hi";
arr[b]="value";
// normally you would do for(var i=0;len=arr.length;i<len;i++){...arr[i]
// but because there may be many empty spots it's quicker to do:
for(thing in arr){
  if(arr.hasOwnProperty(thing)){
    console.log(thing  + " is " + arr[thing]);
  }
}
于 2013-08-20T06:55:58.773 に答える