【问题标题】:Spread an array of objects into a parent object将对象数组传播到父对象中
【发布时间】:2017-04-12 09:56:23
【问题描述】:

有没有一种简单的方法来使用扩展... 运算符将对象数组与另一个对象组合以创建单个对象?这个例子展示了我想要完成的事情:

const arrayOfObjects = [
  { x: 'foo' },
  { y: 'bar' }
];

const obj = {
  hello: 'world'
};

我要找的输出如下:

{
  x: 'foo',
  y: 'bar',
  hello: 'world'
}

除其他外,我尝试了以下方法,但它并没有完全给出预期的输出。

{
  hello: 'world'
  ...arrayOfObjects
}

// Gives
{
  0: { x: 'foo' },
  1: { y: 'bar' },
  hello: 'world'
};

是否可以巧妙地使用展开运算符来做到这一点?

【问题讨论】:

  • Object.assign() 将是这项工作非常有用的工具。

标签: javascript


【解决方案1】:

您可以使用 Object.assign() 和扩展语法 ...

const arrayOfObjects = [{
  x: 'foo'
}, {
  y: 'bar'
}];

const obj = {
  hello: 'world'
};

var result = Object.assign({}, obj, ...arrayOfObjects);
console.log(result)

【讨论】:

  • 谢谢,这似乎是最好的方法。有趣的是,除了... 之外别无他法,但这很好用。谢谢!
  • 你能解释一下为什么传播在这里不起作用吗?我以为我知道关于传播的一切:(
  • @Genesis Algorithms 好吧,当您传播对象数组时,每个单独的元素都是对象,因此您需要为每个对象进行额外的传播,这就是 Object.assign 的用武之地。如果您考虑当你只是做{...arrayOfObjects} 时,你正在尝试类似{{}, {}} 的东西,这是无效的语法。
【解决方案2】:

你可以使用 Object.assign();

Object.assign(obj, ...arrayOfObjects)

此选项将改变对象 obj 而不是创建新实例。

【讨论】:

  • 感谢您澄清这会使对象发生变异。请注意,这也适用于对象属性:let foo = { bar : {} }; Object.assign(foo.bar, ...arrayOfObjects);
【解决方案3】:

Object.assign 很棒,我想出了另一个可能的解决方案,使用 reduce 给喜欢使用它的人


const arrayOfObjects = [
  { x: 'foo' },
  { y: 'bar' }
];

const obj = {
  hello: 'world'
};

let result = arrayOfObjects.reduce((prev, current) => ({
        ...prev,
        ...current
    }), obj)

console.log(result);
// {hello: "world", x: "foo", y: "bar"}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    相关资源
    最近更新 更多