Lodash相当于JSON.parse(JSON.stringify())

时间:2014-08-20 18:19:48

标签: javascript node.js lodash

我目前正在克隆一个对象:

var copy = JSON.parse(JSON.stringify(original));

当我尝试lodash时 - 似乎推荐的方法是cloneDeep(),但这对我来说总是一团糟。我的对象部分由Mongoose查询的结果组成,这可能是造成这种情况的原因。

原件:

template: 'email/receipt.swig',
templateVars: { 
  code: '299137819',

克隆着lodash:

template: 'email/receipt.swig',
templateVars: { 
  '$__': { 
    strictMode: true,
    selected: undefined,
    shardval: undefined,
    saveError: undefined,
    validationError: undefined,
    adhocPaths: undefined,
    removing: undefined,
    inserting: true,
    version: undefined,
    getters: [Object],
    _id: undefined,
    populate: undefined,
    populated: [Object],
    wasPopulated: false,
    scope: [Circular],
    activePaths: [Object],
    ownerDocument: undefined,
    fullPath: undefined 
  },
  isNew: false,
  errors: undefined,
  _maxListeners: 0,
  _events: { save: [Object], isNew: [Object] },
  _doc: { 
    code: '299137819'

这里发生了什么?这显然是Mongo的东西,但为什么重新格式化?有没有办法用lodash制作精确的副本?并不是说我当前的方法很痛苦 - 只是试图理解为什么人们说cloneDeep是等价的。

1 个答案:

答案 0 :(得分:2)

从Mongoose返回的对象不是像你可能期望从数据库中获得的原始键值,但它们还有许多其他功能。最终,cloneDeep does this最终会复制包括函数和其他内容在内的所有内容你可能不想要。

JSON.stringify以及.toJSON将有because of the toJSON行为。

所以实际上它们不等同,因为你可以重新定义JSON序列化行为,而JSON 永远不会序列化函数。