2010-10-08 151 views
4

我有一個鍵值對像使用jQuery.map修改對象?

var classes = { red: 'Red', green: 'Green' };

我怎麼能在前面加上每個鍵與一個特定的值?這可以使用jQuery.map完成嗎?

我在尋找最終的結果是

classes = { 'a-red': 'Red', 'a-green': 'Green' };

+1

'map'僅適用於數組 – 2010-10-08 12:53:08

回答

5

像這樣的工作:

function prependObj(obj, prefix) { 
    var result = {}; 
    for(var i in obj) if(obj.hasOwnProperty(i)) result[prefix+i] = obj[i]; 
    return result; 
} 

那麼你還是這樣稱呼它:

classes = prependObj(classes, "a-"); 

You can test it here。這不是不是修改原始對象,並沒有任何jQuery依賴,所以你可以使用它或不使用。

3

如果你想使用jQuery照顧循環,你可以使用$.each()

您無法真正修改現有的密鑰,但可以使用具有新密鑰和舊值的新密鑰組替換密鑰/值對,並刪除舊密鑰。

var classes = { red: 'Red', green: 'Green' }; 
var newClasses = {}; 

$.each(classes, function(key,val) { 
    newClasses["a-" + key] = val; 
}); 

或者與常規for循環:

var classes = { red: 'Red', green: 'Green' }; 
var newClasses = {}; 

for(var name in classes) { 
    if(classes.hasOwnProperty(name)) 
     newClasses["a-" + key] = classes[name]; 
}); 

var classes = { red: 'Red', green: 'Green' }; 

$.each(classes, function(key,val) { 
    classes["a-" + key] = val; 
    delete classes[key]; 
}); 

編輯:如果你想保持原來的,或者,如果有一個問題,在某些瀏覽器與無限循環(我正在測試...)執行此操作:

+0

這不會導致無限循環嗎? – 2010-10-08 12:52:57

+0

如果'每個'工作在一個副本號。我測試了它,它工作。 – 2010-10-08 12:55:08

+0

@Nick - 它不在Safari中,但好點。我想我會在IE中給它一個測試。 – user113716 2010-10-08 12:55:12

9

給出的答案會起作用,但它們不如使用像.map這樣的純粹功能性結構有趣。下面是一個純粹的功能版本:

$.extend.apply(null, $.map(classes, function(v,k) { var h = {}; h["a-" + k] = v; return h })); 

這工作分兩個步驟:首先,在地圖上的原始對象的鍵值對運行和返回單值對象的列表。其次,$.extend function將這些組合在一起成爲一個單一的對象; .apply method用於將參數作爲數組傳遞給函數。

不幸的是,缺少一個用變量關鍵字來創建對象文字的好方法,這種醜陋,它可能不那麼高效,但卻是一個漂亮的單行程!

0

不要忘記,JavaScript有倒閉:

var classes = { red: 'Red', green: 'Green' }; 
var prefixedClasses = {} 
$.map(classes, function(v, k) { 
prefixedClasses['a-' + k] = v; 
}); 

應該這樣做。