将数组转换为对象的键

102
什么是将数组转换为对象的最佳方法,使得数组值成为新对象的键,空字符串成为新对象的值。
['a','b','c']

to:

{
  a: '',
  b: '',
  c: ''
}

3
你能具体说明一下“最佳方式”是什么意思吗?最有效率的方法可能是使用循环,而最短的代码可能采用函数式编程方法(而且所有的答案都会采用函数式编程方法,因为这是一种时髦的方法)。 - Kaddath
21
Object.fromEntries(['a', 'b', 'c'].map(k => [k, '']));Object.fromEntries(['a', 'b', 'c'].map(k => [k, ''])); - luukvhoudt
2
这里的重复毫无意义。 - Liam
1
@Liam 这个重复的问题 https://dev59.com/qLHma4cB1Zd3GeqPHCm7 似乎是在问同样的问题。 - Mark Rotteveel
关闭与类似但不相同的问题重复,将最佳答案放在问题的评论中...太好了!感谢@luukvhoudt的评论! - TWiStErRob
两个抱怨者,但只有一个重新开放的投票。我投票支持重新开放。 - Rohit Gupta
5个回答

182

尝试使用Array.reduce()

const arr = ['a','b','c'];
const res = arr.reduce((acc,curr)=> (acc[curr]='',acc),{});
console.log(res)


5
“returning (a[b] = '',a)” 的意思是返回一个元组,其中第一个元素是将 a[b] 赋值为空字符串后的 a 数组,第二个元素是未修改的原始数组 a。第二个参数表示原始数组 a。 - Shivam Sahil
3
@ShivamSahil,请检查一下,我已经编辑了答案。循环的每一次,都会将“当前值”插入到累加器中,例如 acc[curr] = '' 。循环结束后,acc 会返回累加器。而 ,{} 表示累加器是一个对象。 - prasanth
4
有人可以添加一个TypeScript版本吗? - cbdeveloper
3
@cbdeveloper TypeScript 版本 https://www.mycompiler.io/view/AlipcFS - prasanth
4
@ShivamSahil提供了一个关于逗号运算符如何工作的好解释: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator - Cezar D.

55

13
为什么要简单而不是复杂... - Tofandel
5
从eslint的角度来看,这种语法比得到最多投票的语法更清晰,+1。 - Jean Paul

22
const target = {}; ['a','b','c'].forEach(key => target[key] = "");

2
为什么要使用 map 来迭代数组?你本可以选择 forEach - Serge K.
forEach 也同样适用。 - Alexus
4
通常情况下,Array.prototype.map 用于创建一个新的数组,传递给 map 函数的函数是一个纯函数。 - HMR
11
人们为什么要在答案非常显然和简单的情况下,试图通过使用reduce来让一切变得复杂,我无法理解。 - Tofandel
5
因为这是 reduce 完美且方便的用法,所以我建议使用它。相较于 forEach 而言,reduce 更加简洁易懂,而且它也是为这种任务而设计的。因此,使用 reduce 并不会使代码变得“复杂”。 - user0103
9
"True one-liners"仅仅让代码更加晦涩难懂。最好添加一行代码,这样你可以立即理解这段代码。 - Tofandel

15
您可以使用Object.assign属性来合并使用map函数创建的对象。请注意,如果数组元素的值不唯一,则后面的值将覆盖先前的值。

const array = Object.assign({},...["a","b","c"].map(key => ({[key]: ""})));
console.log(array);


10
您可以使用数组的reduce函数,并在累加器中传递一个空对象。在此累加器中,添加一个由curr表示的键。

let k = ['a', 'b', 'c']

let obj = k.reduce(function(acc, curr) {
  acc[curr] = '';
  return acc;
}, {});
console.log(obj)

另一种选择是使用 for..of 循环

let k = ['a', 'b', 'c'];
const obj = {};
for (let keys of k) {
  obj[keys] = '';
 }

console.log(obj)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接