Spread运算符不处理以字符串为键的对象

时间:2017-05-18 20:45:40

标签: javascript ecmascript-6 javascript-objects

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

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

let array = [...myObject];

由于对象是从文件结构生成的,因此键由变量组成,并且可以包含特殊字符,因此我需要将它们设置为object[key] = value。为什么我不能在该对象上使用spread运算符(数组总是为空)?有没有像spread-operator一样舒适的解决方法(我不是说用Object.keys创建一个新的数组并使用它)

3 个答案:

答案 0 :(得分:3)

对象spread适用于bojects,您无法将对象传播到array

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



let myObject = {
  'key': "content1",
  'key2': "content2",
  'key3': "content3"
};

let myObject2 = {
  'key4': 'content4'
}

let newObj= {...myObject, ...myObject2};
console.log(newObj);




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

答案 1 :(得分:2)

  

为什么我不能在该对象上使用spread运算符?

首先,... is not an operator!

当该元素 iterable 时,您只能使用spread 元素。对象不可迭代。

  

有没有像spread-operator一样舒适的解决方法(我不是说用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)));




答案 2 :(得分:0)

使用Chrome我发现在对象上使用spread会导致异常。使用Map

的工作是什么