这可能是一个愚蠢的问题,但我正在寻找一种既精确又简洁的方法来创建对象,使用对象文字符号,并为其指定动态属性。
现在,我这样做:
var foo = "lol";
var obj = {};
obj[foo] = "bar";
return obj;
// --> returns {lol:"bar"}
我想做这样的事情:
var foo = "lol";
return ({}[foo] = "bar");
// --> returns {lol:"bar"}
是否有某种模式可以做到这一点?我并不太关心可读性,尽管如果可能的话,我正在寻找紧凑的东西。
我可以这样做,但它非常大,而且非常像将语句分成多行。
var foo = "lol", obj;
return (obj = {}) && (obj[foo] = "bar") && obj;
答案 0 :(得分:1)
编写一个简单的函数,它接受名称:值对作为连续的参数,如:
function dataBlob() {
var args = arguments;
for(var x = 0; x < arguments.length -1; x=x+2) {
this[args[x]] = args[x+1];
}
return this;
}
其中,假设我的JavaScript没有萎缩,上述内容毫无意义,可以用作:
var obj = dataBlob("lol","bar", "lolz", 42);
这相当于JSON-esque
var obj = {lol:"bar", lolz:42};
答案 1 :(得分:1)
的 jsFiddle Demo
强> 的
您正在寻找Object.defineProperty MDN方法。您可以定义一个新对象并使用它来分配动态属性。
function test(){
var foo = "lol";
return Object.defineProperty({},foo,{value:"bar"});
}
alert(test().lol);
答案 2 :(得分:1)
您可以将此方法添加到Object.prototype以获得强大的功能:
Object.prototype.push = function( key, value ){
this[ key ] = value;
return this;
}
var foo = "lol";
var obj = {};
obj.push(foo, "bar")
=>
Object {lol: "bar", push: function}
答案 3 :(得分:0)
不是基于功能的答案的忠实粉丝,我宁愿有某种表达方式。
我提出了更紧凑的形式:
var obj, foo = "lol";
return ((obj = {})[foo] = "bar") && obj;
如果我可以在表达式中包含var obj
,那将会很酷。不确定如何。如果我不必定义obj
变量,那将是最终的。