2013-07-31 73 views
2

是否有任何方式來映射在使用Javascript陣列的鍵和值?在我看來,它類似於jQuery的.map()的東西,但不是唯一的映射值,也是「地圖」的鑰匙。映射鍵/值與JavaScript

假設我有以下數組:

var names = [ 1, 2, 3, 4, 5 ]; 

,我喜歡使用一種稱爲numberToName()功能,我創建並生成該另一個數組,其結果應該是這樣的:

var names = { "one": 1, "two": 2, "three": 3, "four": 4, "five": 5 }; 

目前我使用下面的方法:

var names = [ 1, 2, 3, 4, 5 ], 
    names_tmp = {}, 
    names_i = 0, 
    names_len = names.length; 

for(; names_i < names_len; names_i++) { 
    names_tmp[numberToName(names[names_i])] = names[names_i]; 
} 

問題是:有沒有什麼方法可以改進這種方法?我甚至可以毫無問題地使用jQuery。也許類似這樣的功能:

var names = jQuery.mapKeys([ 1, 2, 3, 4, 5], function(k, v) { 
    return { key: numberToName(v), value: v }; 
}); 

回答

5

您正在尋找reduce

var names = [1, 2, 3, 4, 5].reduce(function(obj, k) { 
    return obj[numberToName(k)] = k, obj; 
}, {}); 

return obj[numberToName(k)] = k, obj是一個速記(誠然不易閱讀)的方式來寫分配+回報:

 obj[numberToName(k)] = k; 
    return obj; 

一個簡單forEach將做的工作太多:

names = {}; 
[1, 2, 3, 4, 5].forEach(function(k) { 
    names[numberToName(k)] = k 
}) 

如果你願意,你也可以用同樣的方法使用jquery的$.each

+1

呃,不,他不是。這是假裝減少低音ackwards方式是地圖或的foreach ... – dandavis

+0

:第二個是更好的。使用「this」避免了封閉,但... – dandavis

+0

@dandavis:我看你明白的問題,編輯您的帖子。我認爲'forEach'比這裏的map更好(如果你不喜歡減少某些原因)。 – georg

1

肯定的是,(如IE9的):

var nums={}; 
[ 1, 2, 3, 4, 5].forEach(function(v, i) { 
    this[numberToName(v)]=v; 
}, nums); 

nums; 

編輯:添加一個索引以方便告訴這是怎麼回事。

編輯:使得它完美的使用的forEach,這即使不是接近$的.MAP(),並運行於[]快約3%.MAP。 (感謝thg435的提示!)