Javascript 将JS数组转换为对象

Javascript 将JS数组转换为对象,javascript,arrays,Javascript,Arrays,我在这里找到了一些类似的线索,但不是一个真正适合我问题的答案。我想使用Javascript将数组转换为对象。给定以下数组: [{id:1,name:"aa"},{id:2,name:"bb"},{id:3,name:"cc"}] 我想达到这样的目标: {1:{name:"aa"},2:{name:"bb"},3:{name:"cc"}} 哪条路最快/最短?考虑到我的数组中可能有1000个项目,如何以有效的方式实现此结果?您可以使用迭代数组,将id作为键,并为此属性分配一个新对象 var数组

我在这里找到了一些类似的线索,但不是一个真正适合我问题的答案。我想使用Javascript将数组转换为对象。给定以下数组:

[{id:1,name:"aa"},{id:2,name:"bb"},{id:3,name:"cc"}]
我想达到这样的目标:

{1:{name:"aa"},2:{name:"bb"},3:{name:"cc"}}

哪条路最快/最短?考虑到我的数组中可能有1000个项目,如何以有效的方式实现此结果?

您可以使用迭代数组,将id作为键,并为此属性分配一个新对象

var数组=[{id:1,名称:“aa”},{id:2,名称:“bb”},{id:3,名称:“cc”}],
对象={};
array.forEach(函数(a){
对象[a.id]={name:a.name};
});

document.write(''+JSON.stringify(object,0,4)+'')您可以选择将1更改为其他值

var arrObject=[{id:1,名称:“aa”},{id:2,名称:“bb”},{id:3,名称:“cc”}]

var jsObjectToJSONString=JSON.stringify({1:arobject})

使用:

我想没有循环就没有办法了

循环处理10000个对象的数组不会“慢”吗

定义“慢”。但是,是的,10000个对象是很多的,不管你对它们做什么操作

编辑 您还可以使用和(如果您喜欢util库和函数式编程):


<>这是你如何动态地做的,如果有可能在数组中的一些对象有不同的名称或者存在不同的键的数量(注意我给每个数组项加了一个“数字”字段),这是理想的。
var objArr=[{id:1,名称:“aa”,编号:25},{id:2,名称:“bb”,编号:10},{id:3,名称:“cc”,编号:8}],
jsonObj={};
对于(变量i=0;iconsole.log(jsonObj)
那么你有JSON,还是有数组?把一组可以通过数字索引访问的对象转换成一组结构稍有不同的对象,以相同的顺序,可以通过数字索引访问,这有什么意义?(遗憾的是,我无法复制它,我已经出于另一个原因投票关闭了)。您有一个对象数组。
reduce
在这里没有提供任何实质性内容,并且引入了复杂性(记住返回累加器,它实际上不会改变)。这会引起bug,就像答案中的一样。编辑:编辑之前答案中的选项。:-)@T.J.Crowder感谢您指出返回错误。然而,我认为在这种情况下,
reduce
是ES5中提供的本机迭代器中语义选择较多的一种。我的观点是,
reduce
只是当累加器发生变化时(例如使用求和)一种有用的语义选择。如果没有(整个时间都是同一个对象引用),我更喜欢简单地
forEach
关闭目标。每个人都有自己的。@T.J.Crowder,fair Point也有帮助,谢谢Josh。“慢”当然。。非常精确:)使用
object[a.id]
而不是
object[i]
可以满足我的需要。感谢这是非常有效和简单的,但这不包括动态键,因为在“forEach”函数中,您显式地设置了“name”键。@Brett84c,这不是规范。这不会产生OP想要的输出。确实如此,但我想这并不是“最快/最短的方式”。就我个人而言,我认为这样做比静态设置对象的“name”属性要好。如果JSON的长度或键名发生了任何变化,“最短/最快方式”将不再有效。如果查看预期的输出,您将看到该对象具有键1、2、3,而您的对象具有键0、1、2。OP似乎想使用对象的
id
作为属性名,而不是它们在数组中的位置。啊,我明白了。我可以修改我的代码来解决这个问题,但在这一点上,它似乎并不重要。是的,这不是这个问题的预期答案,我想到了JS数组对象转换为JSON字符串。
[{id:1,name:"aa"},{id:2,name:"bb"},{id:3,name:"cc"}].reduce(function(result, current) {
  result[current.id] = current;
  delete current.id;

  return result;
}, {});
_.chain([{id:1,name:"aa"},{id:2,name:"bb"},{id:3,name:"cc"}])
.keyBy(function(o) {
  return o.id;
})
.mapValues(function(o) {
  return _.omit(o, ['id']);
})
.value();