2013-12-14 24 views
3

這可能是一個愚蠢的問題,但我正在尋找一種既美觀又簡潔的方式來創建一個對象,使用對象字面符號併爲其分配一個動態屬性。有沒有辦法創建一個對象並同時爲其分配一個動態屬性?

現在,我在做這樣的:

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; 
+3

我認爲你最好的選擇是創建一個指定屬性的函數。 –

+1

@阿倫:(1)那是無效的JS。 (2)屬性名稱不是動態的。 –

+0

是的。對不起我的錯誤 –

回答

0

不是基於函數的答案,一個巨大的風扇,我寧願有某種的表達。

我想出了更緊湊的形式:

var obj, foo = "lol"; 
return ((obj = {})[foo] = "bar") && obj; 

這將是冷靜,如果我能有表達內var obj。不知道如何。如果我不需要定義obj變量,這將是最終的。

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式的

var obj = {lol:"bar", lolz:42}; 
1

jsFiddle Demo

您正在尋找Object.defineProperty MDN方法。您可以定義一個新對象並使用它來分配動態屬性。

function test(){ 
var foo = "lol"; 
return Object.defineProperty({},foo,{value:"bar"});  
} 

alert(test().lol); 
1

JSFidle Example

您可以添加此方法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} 
相關問題