【问题标题】:Lodash equivalent of JSON.parse(JSON.stringify())相当于 JSON.parse(JSON.stringify()) 的 Lodash
【发布时间】:2014-08-20 18:19:47
【问题描述】:

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

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 是等价的。

【问题讨论】:

    标签: javascript node.js lodash


    【解决方案1】:

    从 Mongoose 返回的对象不是您可能期望从 DB 中获得的原始键值,但它们内置了许多其他功能。最终,cloneDeep does this,最终复制了所有内容,包括函数和其他内容不想。

    JSON.stringify.toJSON 将起作用 because of the toJSON 行为。

    所以实际上它们是不等价的,因为您可以重新定义 JSON 序列化行为,而 JSON 永远无论如何都不会序列化函数。

    【讨论】:

    • 我知道它可能会复制其他内容,但结构完全不同。对于 ex orig.templateVars.code 现在是未定义的,这使得这种副本毫无用处。为什么要重组?那么lodash就没有办法维持结构了吗?
    • 与其进行深度克隆,不如只使用 .toObject() 从您的 Mongoose 文档中创建普通的、可编辑的对象。
    猜你喜欢
    • 2012-06-22
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2022-01-25
    相关资源
    最近更新 更多