【问题标题】: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

标签: javascript object key spread-syntax


【解决方案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.stackoverflow.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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 2019-12-05
      • 2021-12-01
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2019-07-23
      相关资源
      最近更新 更多