我有一个包含许多唯一字符串的数组,我想,如果可能的话,不用循环来创建一个映射对象,其中每个元素的键是一个唯一的字符串,并且该值默认为某个任意设置
有没有办法在没有循环的情况下在一行中执行此操作?即我想从
开始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
};
答案 0 :(得分:4)
如果你真的想要完全跳过循环(包括像map
这样的函数),这可行:
JSON.parse('{"'+colours.join('":"VAL", "')+'":"VAL"}');
这会构建一个JSON字符串,然后对其进行解析。
但是,我不会使用此功能。这是丑陋,低效,难以维护,使用循环“引擎盖下”,它通常是糟糕的形式。 (我甚至不愿意使用eval
而不是JSON。eval === evil
)。
改为map
代替:
var colours = [ "Red", "Orange", "Yellow", "Green", "Blue", "Indigo", "Violet" ];
var colourMap = {};
colours.forEach(function(c){
colourMap[c] = "VAL";
});
是的,它正在循环遍历colours
,但效率更高,更容易理解。
关于表现:
在谷歌浏览器中, map
和reduce
seem to be similar的执行速度(reduce
略快一点)。
答案 1 :(得分:4)
假设您的浏览器要求支持Array.prototype.reduce
colours.reduce(function(obj, c){
obj[c] = "VAL";
return obj;
}, {})
或者如果你是一个混蛋并且使用语法,那么大多数js开发者甚至不知道存在
colours.reduce(function(obj, c){ return (obj[c] = "VAL", obj) }, {})
答案 2 :(得分:2)
你可以用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"] }))