【问题标题】:Object.assign not working as expectedObject.assign 未按预期工作
【发布时间】:2016-03-25 15:48:04
【问题描述】:

我有一个名为 bookings 的对象,其中有几个属性,我想用 Object.assign 进行扩展,如下所示:

let data = Object.assign(booking, {
  hiw: event.hiw[booking.locale],
  tip: event.tip[booking.locale],
  start: moment(event.start).format('L')
});

但是当我打印数据时,结果将是来自源(预订)的相同对象,因此hiwtipstart 将被忽略,但是......如果我尝试这样做:

let data = Object.assign({}, {
  hiw: event.hiw[booking.locale],
  tip: event.tip[booking.locale],
  start: moment(event.start).format('L')
});

这会很完美。

我的问题是:我在这里做错了什么?为什么我不能扩展booking 而我可以扩展空对象?

这绝对不是异步代码的问题,当我尝试延长预订时,他已经存在,里面的所有属性。

我也尝试使用下划线extend 方法,行为完全一样。

【问题讨论】:

  • 您能否在调用assign之前和之后打印预订时显示您拥有的内容?
  • 这似乎在 Chrome 中工作,它(理论上)使用与 node.js 相同的引擎。 hiwtipstart 是否不可枚举或拥有 booking 的属性? jsfiddle.net/mikemccaughan/2959resk
  • 我想知道错误是在let 块分配中还是在您尝试分配的属性中。我整理了一个很轻的mock-up,它可以工作。
  • 听起来问题出在您在此代码之前分配booking 的方式上。
  • 如果您能提供更多上下文,那就太好了。

标签: javascript node.js mongoose ecmascript-6


【解决方案1】:

Mongoose 文档(模型实例)很特殊:它们只会打印模式中存在的属性。

如果没有在此处定义属性,则当您 console.log() 时它们不会显示(如果您使用 obj.toObject() 将文档转换为纯 JS 对象也不会显示)。

这意味着使用Object.assign() 仅在您分配也存在于架构中的属性时才有效。任何未声明的属性都不会显示(也不会保存到数据库中)。

如果您打算使用文档进行输出,则应先将其转换为适当的 JS 对象,然后再分配给它:

let data = Object.assign(booking.toObject(), {
  hiw   : event.hiw[booking.locale],
  tip   : event.tip[booking.locale],
  start : moment(event.start).format('L')
});

【讨论】:

    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 2021-06-04
    • 2022-01-24
    • 2015-05-11
    • 2020-05-15
    • 2014-10-31
    • 2018-02-12
    • 2014-01-20
    相关资源
    最近更新 更多