如何从Javascript中的字符串列表创建地图(对象)

时间:2014-02-03 15:13:39

标签: javascript arrays string map

我有一个包含许多唯一字符串的数组,我想,如果可能的话,不用循环来创建一个映射对象,其中每个元素的键是一个唯一的字符串,并且该值默认为某个任意设置

有没有办法在没有循环的情况下在一行中执行此操作?即我想从

开始
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
};

3 个答案:

答案 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,但效率更高,更容易理解。

关于表现:

在谷歌浏览器中,

mapreduce 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"] }))