Object.assign不按预期工作

5

我有一个名为bookings的对象,它包含多个属性。我想使用Object.assign方法扩展该对象,示例代码如下:

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

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

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

这将完美地工作。

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

这绝对不是异步代码的问题,当我尝试扩展 booking 时,它已经存在并具有所有属性。

我还尝试使用 underscore 的 extend 方法,行为完全相同。


2
在调用assign之前和之后打印booking时,你能展示一下你所拥有的内容吗? - jonasnas
这在Chrome中似乎可以工作,因为它(理论上)使用与node.js相同的引擎。 hiwtipstart不是booking的可枚举或自有属性吗?https://jsfiddle.net/mikemccaughan/2959resk/ - Heretic Monkey
我在想错误是在 let 块赋值还是在你尝试分配的属性中。我制作了一个非常简单的 模拟,它可以工作。 - Mark C.
听起来问题可能出在你在这段代码之前分配 booking 的方式上。 - Barmar
我更新了问题。 - user5526811
显示剩余3条评论
1个回答

10

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

如果没有定义属性,则当您使用console.log()(或者将文档转换为普通JS对象使用obj.toObject())时,这些属性将不会显示。

这意味着使用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')
});

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