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

如何从Javascript中的字符串列表创建映射(对象),javascript,arrays,string,map,Javascript,Arrays,String,Map,我有一个由许多唯一字符串组成的数组,如果可能的话,我不想循环,我想从中创建一个map对象,其中每个元素的键都是一个唯一的字符串,值默认为任意设置 有没有一种方法可以在一行中不循环地完成这项工作?也就是说,我想从 var colours = [ "Red", "Orange", "Yellow", "Green", "Blue", "Indigo", "Violet" ]; 到 您可以使用jQuery执行此操作: colourMap = $.map(colours, function(e){

我有一个由许多唯一字符串组成的数组,如果可能的话,我不想循环,我想从中创建一个map对象,其中每个元素的键都是一个唯一的字符串,值默认为任意设置

有没有一种方法可以在一行中不循环地完成这项工作?也就是说,我想从

var colours = [ "Red", "Orange", "Yellow", "Green", "Blue", "Indigo", "Violet" ];


您可以使用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"] }))

您可以使用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"] }))
如果您真的想完全跳过循环,包括map之类的函数,可以这样做:

JSON.parse('{"'+colours.join('":"VAL", "')+'":"VAL"}');
这将构建一个JSON字符串,然后对其进行解析

但是,我不会使用这个函数。它丑陋、低效、难以维护,在引擎盖下使用环,而且通常形式很差。我甚至不想用eval来代替JSON。eval==邪恶

选择类似地图的内容:

是的,它是通过颜色循环的,但是它更有效,更容易理解

关于绩效:

在Google Chrome中,map和reduce的执行速度reduce稍微快一点。

如果你真的想跳过包括map这样的函数在内的循环,这是可行的:

JSON.parse('{"'+colours.join('":"VAL", "')+'":"VAL"}');
这将构建一个JSON字符串,然后对其进行解析

但是,我不会使用这个函数。它丑陋、低效、难以维护,在引擎盖下使用环,而且通常形式很差。我甚至不想用eval来代替JSON。eval==邪恶

选择类似地图的内容:

是的,它是通过颜色循环的,但是它更有效,更容易理解

关于绩效:


在谷歌浏览器中,map和reduce的执行速度reduce稍快一些。

假设您的浏览器要求支持

或者,如果你愿意做一个混蛋,使用大多数js开发人员都不知道的语法

colours.reduce(function(obj, c){ return (obj[c] = "VAL", obj) }, {})

假设您的浏览器需求支持

或者,如果你愿意做一个混蛋,使用大多数js开发人员都不知道的语法

colours.reduce(function(obj, c){ return (obj[c] = "VAL", obj) }, {})


对于下划线:u.object_u.mapColorMap,functionc{return[c,VAL]}通常我使用这种模式,以至于我做u.mixin{mapObject:u.compose_u.object,uu.map}从技术上讲,这些仍然是循环。嗯,我认为您的代码生成了一个对象数组,每个颜色对应一个。每个都只有一个键…是的,恐怕我没有访问jQuery的权限。务实地说,我认为即使是一个班轮也可能在封面下循环。我真的在寻找这样做的最有效的方法,因为它的代码将被频繁调用。就@AndreaParodi而言,上面的jquery示例并不能产生您想要的结果,您必须执行colorMap=$.extend.apply$。。。为了将所有内容都放在一个带有下划线的object中:u.object_u.mapColorMap,functionc{return[c,VAL]}通常我经常使用这种模式,所以我会u.mixin{mapObject:u.compose_u.object,u.map}从技术上讲,这些仍然是循环。嗯,我认为您的代码会生成一个对象数组,每个颜色对应一个。每个都只有一个键…是的,恐怕我没有访问jQuery的权限。务实地说,我认为即使是一个班轮也可能在封面下循环。我真的在寻找这样做的最有效的方法,因为它的代码将被频繁调用。就@AndreaParodi而言,上面的jquery示例并不能产生您想要的结果,您必须执行colorMap=$.extend.apply$。。。为了将所有内容都整合到一个对象中,语法还可以,我喜欢这个解决方案,+1@Cerburs有些语言称之为fold、foldl或aggregate,都是相同的概念。语法还可以,我喜欢这个解决方案,+1@Cerburs有些语言称之为fold、foldl或aggregate,都是相同的概念。只是一个小提示:显然,它不会适用于所有可能的VALsYea,JSON选项必须产生有效的JSON。一些VAL可能会破坏它。这就是为什么它是一个糟糕的选项之一。json.parse在内部使用循环,所以仍然循环。如果你真的想避免循环,你可以求值,但这太过分了,太荒谬了。请注意:很明显,它不会适用于所有可能的VALsYea,JSON选项必须产生有效的JSON。一些VAL可能会破坏它。这就是为什么它是一个糟糕的选项之一。json.parse在内部使用循环,所以仍然循环。如果你真的想避免循环,你可以求值,但这太过分了,太荒谬了。你在下面的评论中提到,你正在寻求优化这一性能,因为这段代码将被重复编写。首先,您不能将其缓存在更高范围的变量中吗?除非颜色列表或VAL每次都会不同,否则没有理由不能。第二,你确定性能是个问题吗?loop、reduce、forEach和下划线的大多数不同技术的性能非常相似,不太可能成为您的瓶颈。微优化前的轮廓@地理位置
莫耶:是的,我会跟进的。我想我潜在的兴趣是,是否有一种方法可以做到这一点,而这种方法是不存在的——听起来好像没有。JS几乎从来没有像你在CS中学到的那样精确地遵循ptime预测。根据您的需要,Object.create可能会快得多。我认为在无序数组的每个元素上的任何操作都不可能少于on。然而,这不是大多数算法试图达到的确切情况吗?一旦你上了,你基本上就没有问题了。当然,在V8或TraceMonkey中做一些重复的基准测试,你就会明白我的意思了。如果例程是编译的,而不是运行时优化的,那么旧的规则将适用。您在下面的注释中提到,您希望对其进行性能优化,因为此代码将被重复编译。首先,您不能将其缓存在更高范围的变量中吗?除非颜色列表或VAL每次都会不同,否则没有理由不能。第二,你确定性能是个问题吗?loop、reduce、forEach和下划线的大多数不同技术的性能非常相似,不太可能成为您的瓶颈。微优化前的轮廓@乔治马勒:是的,我会跟进的。我想我潜在的兴趣是,是否有一种方法可以做到这一点,而这种方法是不存在的——听起来好像没有。JS几乎从来没有像你在CS中学到的那样精确地遵循ptime预测。根据您的需要,Object.create可能会快得多。我认为在无序数组的每个元素上的任何操作都不可能少于on。然而,这不是大多数算法试图达到的确切情况吗?一旦你上了,你基本上就没有问题了。当然,在V8或TraceMonkey中做一些重复的基准测试,你就会明白我的意思了。如果例程已编译且未进行运行时优化,则应用旧规则。