如果我有一个对象,像这样
var o = {
test : 1
}
我想要第二个对象,其中一个键应该是 o.test 的值。像这样的东西:
var o2 = {
o.test : "bla"
}
我知道这是不可能的,但有没有更好(更清洁)的方法来做这件事,就像我现在做的那样?
目前我是这样的:
var o2 = {};
o2[o.test] = "bla"
我想有更好的方法吗?
如果我有一个对象,像这样
var o = {
test : 1
}
我想要第二个对象,其中一个键应该是 o.test 的值。像这样的东西:
var o2 = {
o.test : "bla"
}
我知道这是不可能的,但有没有更好(更清洁)的方法来做这件事,就像我现在做的那样?
目前我是这样的:
var o2 = {};
o2[o.test] = "bla"
我想有更好的方法吗?
我想有更好的方法吗?
假设我已经正确理解了您的问题,那么不,不是真的。你展示的方式就是这样做的方式。无法在文字本身内部使用动态键,因此您必须先声明它,然后单独分配属性:
var o2 = {};
o2[o.test] = "bla";
o2; // { 1: "bla" }
更新
完整的细节在规范中给出。这是对象文字属性标识符的语法:
PropertyName :
IdentifierName
StringLiteral
NumericLiteral
StringLiteral产生式是不言自明的。下面是IdentifierName产生的作用:
产品PropertyName : IdentifierName的评估如下:
- 返回包含与IdentifierName相同的字符序列的String 值。
对于NumericLiteral生产:
产生式PropertyName : NumericLiteral的评估如下:
- 令nbr为形成NumericLiteral值的结果。
- 返回ToString ( nbr )。
从这里可以看出,在对象初始化器中除了字符串之外,不能使用任何东西。
这是 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'
);
您的对象属性可以是任何字符串
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]);
}
}