【问题标题】:How to use the rest and spread operators together in a function definition?如何在函数定义中同时使用其余运算符和展开运算符?
【发布时间】:2017-03-16 14:57:15
【问题描述】:

我有以下:

const a = (...args) =>{ return {...args}}
const abc = a('lol', 'rofl', 'lmao');
console.log('abc', abc);

但是,这会打印出来

Object {0: "lol", 1: "rofl", 2: "lmao"}

但我期待

Object {lol: "lol", rofl: "rofl", lmao: "lmao"}

因为

{lol, rofl, lmao}

产生上面的行。

有没有办法传播论点以便我得到这个结果?

【问题讨论】:

  • FWIW 这不是 Ecmascript-6。
  • @lonesomeday 什么?
  • 我认为 OP 正在尝试使用 ES6 中提供的简写语法动态生成对象,我不确定这是否可能。
  • 因此,在对象解构中使用 spread/rest 运算符是实验性的,不是官方 ES2015 规范的一部分。这可能是使规范走上正轨的一个功能,但就目前而言,这是不可能的。 Kyle Simpson 在他的“ES6:正确的部分”研讨会中谈到了这一点
  • ... is not an operator!而且{...args}{lol, rofl, lmao} 不一样。对象传播相当于使用Object.assign:Object.assign({}, args)args 是一个(字符串)数组,这就是你得到这个结果的原因。

标签: javascript ecmascript-6 ecmascript-next


【解决方案1】:

我不认为有任何内置方法可以做到这一点,spread syntax 不会像您预期的那样工作。无论如何,你可以使用Array#reduce 方法。

const a = (...args) => args.reduce((obj, v) => (obj[v] = v, obj), {})
const abc = a('lol', 'rofl', 'lmao');
console.log('abc', abc);

【讨论】:

    【解决方案2】:

    您可以使用Object.assign 和计算属性。

    const a = (...args) => args.reduce((obj, v) => Object.assign(obj, { [v]: v }), {});
    const abc = a('lol', 'rofl', 'lmao');
    
    console.log('abc', abc);

    【讨论】:

      【解决方案3】:

      你可以这样做;

      function F(...args){
        args.forEach(a => this[a] = a, this);
      }
      var abc = new F('lol', 'rofl', 'lmao');
      console.log('abc', abc);

      【讨论】:

      • 为什么要介绍new
      • @Bergi 因为F 不是工厂,我没有从构造函数返回任何东西。但我很确定你的口袋里藏着什么东西。好的,让我们看看。 :)
      • 我的意思是,为什么要使用构造函数呢?它应该是一个工厂函数。
      • @Bergi,嗯,可能是可能不是。一个原因可能是需要稍后填充F.prototype
      • OP 想要一个计划 Object,而不是继承自自定义原型的东西
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多