Javascript对象(动态属性名称)

时间:2013-08-20 06:52:24

标签: javascript object

如果我有一个像这样的对象

var o = {
  test : 1
}

我希望有第二个对象,其中一个键应该是o.test的值。 像这样:

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

我知道这是不可能的,但现在这样做有更好(更清洁)的方法吗?

目前我所说的是:

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

我想有更好的方法吗?

3 个答案:

答案 0 :(得分:7)

  

我想有更好的方法吗?

假设我已正确理解你的问题,那么不,不是真的。你展示的方式是做到这一点的方式。无法在文字本身内部使用动态密钥,因此您必须先声明它,然后单独分配属性:

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

o2; // { 1: "bla" }

<强>更新

详细信息见in the spec。这是对象文字属性标识符的语法:

  

PropertyName
   IdentifierName
  串文字
   NumericLiteral

StringLiteral 制作是不言自明的。以下是 IdentifierName 生产的作用:

  

生产 PropertyName IdentifierName 的评估方式如下:

     
      
  1. 返回字符串值,其中包含与 IdentifierName 相同的字符序列。
  2.   

对于 NumericLiteral 制作:

  

生产 PropertyName NumericLiteral 评估如下:

     
      
  1. nbr 成为 NumericLiteral 的值的结果。
  2.   
  3. 返回 ToString nbr )。
  4.   

您可以从中看到,在对象初始化器中不能使用除字符串之外的任何内容。

答案 1 :(得分: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]);
  }
}

答案 2 :(得分:0)

这是javascript,几乎总有一种解决方法可以做你想做的事。

没有语法用于执行您想要的操作,但您当然可以编写一个函数来执行此操作:

function make () {
    // Optional sanity check:
    if (arguments.length % 2) throw "Number of arguments should be even!";

    var obj = {};
    for (var name=0,val=1; name < arguments.length; name+=2,val+=2) {
        obj[arguments[name]] = arguments[val];
    }
    return obj;
}

现在你可以这样写:

var o2 = make(
    o.test,        'bla',
    'another_key', 'another_val'
);