我目前正在克隆一个对象:
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是等价的。
答案 0 :(得分:2)
从Mongoose返回的对象不是像你可能期望从数据库中获得的原始键值,但它们还有许多其他功能。最终,cloneDeep
does this最终会复制包括函数和其他内容在内的所有内容你可能不想要。
JSON.stringify
以及.toJSON
将有because of the toJSON
行为。
所以实际上它们不等同,因为你可以重新定义JSON序列化行为,而JSON 永远不会序列化函数。