对象键集中的传播语法不起作用
Posted
技术标签:
【中文标题】对象键集中的传播语法不起作用【英文标题】:Spread syntax in object key set not working 【发布时间】:2019-02-12 06:16:22 【问题描述】:我有一个字符串数组,我想把它变成一个对象,其中每个键都是一个单词。我正在这样做:
let arr = ['a', 'b', 'c'];
let obj = ;
obj[...arr] = true;
但是,这似乎不起作用:(
有谁知道我做错了什么?
【问题讨论】:
嗯,语法中没有规定可以做你想做的事情。 “传播”也不是运算符;这是一个语法约定。它不是运算符所在的表达式语法的一部分。 猜猜我只需要循环执行吗? 我不知道有其他方法可以做到这一点。然而,也许一些聪明的人会这样做。 我大概可以使用reduce ***.com/questions/4215737/convert-array-to-object 【参考方案1】:使用forEach
更短。
let arr = ['a', 'b', 'c'];
var obj =
arr.forEach(e=>obj[e]=true)
console.log(obj)
但您可以使用Array.prototype.reduce(),这可能更快。
let arr = ['a', 'b', 'c'];
var obj = arr.reduce((acc,c,i)=>
acc[c] = true; return acc;
,)
console.log(obj)
相反,你可以使用spread syntax:
var obj =
"a": true,
"b": true,
"c": true
var arr = [...Object.keys(obj)];
console.log(arr)
扩展语法需要一个可迭代的对象,例如数组,但也可以是对象,请参阅iteration protocols。在上面的例子中,我们使用了Object.keys(obj)
,它返回一个数组。
【讨论】:
【参考方案2】:您可以更简洁地使用Array.prototype.reduce()
:
const fill = v => (o, k) => ( ...o, [k]: v )
let arr = ['a', 'b', 'c']
let obj = arr.reduce(fill(true), )
console.log(obj)
如果你真的不喜欢每次迭代都复制累加器o
,你可以改用Object.assign()
:
const fill = v => (o, k) => Object.assign(o, [k]: v )
let arr = ['a', 'b', 'c']
let obj = arr.reduce(fill(true), )
console.log(obj)
甚至只是
const fill = v => k => ( [k]: v )
let arr = ['a', 'b', 'c']
let obj = Object.assign(...arr.map(fill(true)))
console.log(obj)
【讨论】:
@OlivierBoissé 你应该自己尝试一下,看看你会得到什么;) @OlivierBoissé 啊,不用担心。 meta.***.com/q/373577/1541563 如您所见,我目前正在修复一个被滥用的标签。【参考方案3】:您可以使用reduce
函数将obj
填充为真值
const arr = ['a', 'b', 'c'];
const obj = arr.reduce((acc, val) =>
acc[val] = true;
return acc;
, );
console.log(obj);
【讨论】:
以上是关于对象键集中的传播语法不起作用的主要内容,如果未能解决你的问题,请参考以下文章