[英]How to create a map (object) from list of strings in Javascript
我有許多唯一字符串的數組,我希望盡可能不循環就從中創建一個地圖對象,其中每個元素的鍵是唯一字符串,並且該值默認為任意設置。
有沒有辦法我可以在一行中做到這一點而無需循環? 即我想從
var colours = [ "Red", "Orange", "Yellow", "Green", "Blue", "Indigo", "Violet" ];
至
var colourMap = {
"Red": VAL,
"Orange": VAL,
"Yellow": VAL,
"Green": VAL,
"Blue": VAL,
"Indigo": VAL,
"Violet": VAL
};
如果您真的想完全跳過循環(包括map
函數),那么可以這樣做:
JSON.parse('{"'+colours.join('":"VAL", "')+'":"VAL"}');
這將構建一個JSON字符串,然后對其進行解析。
但是,我不會使用此功能。 它很丑陋,效率低下,難以維護,並在“幕后”使用循環,通常是不好的形式。 (我什至不會用eval
代替eval === evil
)。
去像map
這樣的東西:
var colours = [ "Red", "Orange", "Yellow", "Green", "Blue", "Indigo", "Violet" ];
var colourMap = {};
colours.forEach(function(c){
colourMap[c] = "VAL";
});
是的,它在colours
循環,但是更有效,更容易理解。
關於性能:
在Chrome瀏覽器中, map
和reduce
執行速度似乎相似 ( reduce
速度稍快)。
假設您的瀏覽器要求支持Array.prototype.reduce
colours.reduce(function(obj, c){
obj[c] = "VAL";
return obj;
}, {})
或者如果您可以混蛋並且使用語法,大多數js開發人員甚至都不知道存在
colours.reduce(function(obj, c){ return (obj[c] = "VAL", obj) }, {})
您可以使用jQuery來做到這一點:
colourMap = $.map(colours, function(e){
return { e: "VAL" };
});
或使用下划線:
var colourMap = {};
_.each(some_object_array, function(val) {
colourMap[val] = "VAL";
});
甚至更好(感謝George Mauer):
_.object(_.map(colourMap, function(c) { return [c, "VAL"] }))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.