对象中键为字符串时,展开运算符无法正常工作

4

我目前正在使用ES6和Babel(es2015预设)编写一些代码,但是我无法像以前那样扩展一个对象。通常我会取一个对象,使用扩展并映射内部内容,例如[...someObject].map(dosomestuff)。但我的一个对象行为与预期不同,到目前为止我找到的唯一区别是键:

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

let array = [...myObject];

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


1
这里的期望结果是什么? - Nenad Vracar
我想要获取一个数组,可以像[内容,内容,内容].map(doSomething)一样进行映射。 - knigge
你可以将键映射到值,或者使用Object.values(myObject) - Nenad Vracar
1
... 不是一个运算符!为什么我不能在那个对象上使用扩展运算符?只有当该元素是可迭代的时,你才能使用扩展元素。对象不是可迭代的。 - Felix Kling
3个回答

6

对象 spread 在对象上运作,你不能将一个对象展开成为一个 array

你应该将其展开到另一个对象中:

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

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

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

这不是ES6的一部分,但它处于第三阶段


1
这是无效的ES6。 - Felix Kling
使用 babel https://babeljs.io/docs/plugins/transform-object-rest-spread/ - Sagiv b.g
1
当然,但是有人怎么从你的回答中推断出来呢? - Felix Kling

2
首先,...不是运算符
只有在元素可迭代时才能使用扩展元素。对象不可迭代。
在ES6中没有像扩展运算符一样方便的解决方法(我并不是指使用Object.keys创建新的数组)。
我假设你想从对象获取属性值。
如果你不想编写帮助函数,也不一定要使用扩展元素,你可以利用Array.from的第二个参数的映射函数功能:
Array.from(Array.keys(myObject), x => myObject[x]);

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

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


0

使用Chrome时,我发现在对象上使用spread会导致异常。可行的方法是使用Map


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接