对象键集中的传播语法不起作用

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);

【讨论】:

以上是关于对象键集中的传播语法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

插件中的传播语法在 IE/edge 中不起作用

JavaScript - 如何合并/附加到对象/数组 - ReactJS - 传播语法

为啥我的扩展语法在节点 v7.0.0 中不起作用?

春季侦探行李传播不起作用

中继片段传播不起作用

使用 push_back 将对象添加到 vector 工作正常,但使用访问器语法 [ ] 添加对象,不起作用