【问题标题】:Spread operator not working on Objects with string as key扩展运算符不适用于以字符串为键的对象
【发布时间】:2017-10-18 20:10:33
【问题描述】:

我正在用 ES6 和 Babel(es2015 预设)编写一些代码 atm,但我不能像以前那样传播一个对象。通常我会使用一个对象,使用扩展并映射内部内容,如[...someObject].map(dosomestuff)。但是我的一个对象没有按预期运行,到目前为止我发现的唯一区别是键:

let myObject = {
  'key': content,
  'key2': content,
  'key3': content
};

let array = [...myObject];

由于对象是从文件结构中生成的,因此键是由变量形成的,并且可以包含特殊字符,因此我需要将它们设置为 object[key] = value。为什么我不能在该对象上使用扩展运算符(数组始终为空)?是否有一种与扩展运算符一样舒适的解决方法(我的意思不是用 Object.keys 制作一个新数组并使用它)

【问题讨论】:

  • 这里想要的结果是什么?
  • 我想要一个可以像 [content, content, content].map(doSomething) 映射的数组
  • 你可以map()键值或使用Object.values(myObject)
  • ... is not an operator! "为什么我不能在那个对象上使用展开操作符" 你只能在元素是 时使用展开元素 >可迭代。对象不可迭代。

标签: javascript ecmascript-6 javascript-objects


【解决方案1】:

在 Chrome 中,我发现在对象上使用 spread 会导致异常。什么工作是使用Map

【讨论】:

    【解决方案2】:

    对象spread 适用于对象,您不能将对象传播到array

    你应该spread它到另一个对象:

    let myObject = {
      'key': "content1",
      'key2': "content2",
      'key3': "content3"
    };
    
    let myObject2 = {
      'key4': 'content4'
    }
    
    let newObj= {...myObject, ...myObject2};
    console.log(newObj);

    这不是 ES6 的一部分,但它在 stage 3

    【讨论】:

    【解决方案3】:

    为什么我不能在那个对象上使用扩展运算符?

    首先,... is not an operator!

    只有当元素是 iterable 时,您才能使用展开的元素。对象不可迭代。

    有没有像扩展运算符一样舒适的解决方法(我不是说用 Object.keys 制作一个新数组并使用它)

    在 ES6 中没有。

    我假设你想从对象中获取属性values

    如果您不想编写辅助函数并且不一定要使用展开元素,您实际上可以利用Array.from 将映射函数作为第二个参数的能力:

    Array.from(Array.keys(myObject), x => myObject[x]);
    

    如果你真的不想使用Object.keysObject.values 在 ES6 中不存在),那么你可以编写自己的辅助函数作为生成器:

    function* values(obj) {
      for (var x in obj) {
        // You can use `obj.hasOwnProperty(x)` to guard against inherited properties
        // to achieve the same effect as `Object.keys`
        yield obj[x];
      }
    }
    
    let myObject = {
      'key': 'content',
      'key2': 'content1',
      'key3': 'content2'
    };
    
    console.log([...values(myObject)]);
    // or
    console.log(Array.from(values(myObject)));

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 2017-12-07
      • 2018-06-16
      • 2023-03-25
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      相关资源
      最近更新 更多