在我的Angular fullstack
项目中,我尝试更新项目,为其添加新的子文档。在合并之前检查我的req.body
时,它看起来应该是应该的。但是在合并之后,更新的文档已经添加了一个新的子文档,唯一的问题是这个新文档是已经存在的文档的克隆,而不是应该存在的文档。
_.merge
来自lodash
代码:
console.log('');
console.log('notes before merging : ', entry.notes);
console.log('');
console.log('body.notes before merging : ', req.body.notes);
var updated = _.merge(entry, req.body);
console.log('');
console.log('notes after merging : ', updated.notes);
运行代码时我的控制台结果:
notes before merging :
[
{
content: '<p>testing</p>',
date: Thu Apr 16 2015 10:14:44 GMT+0200 (Rom, sommertid),
writer: 55193679026666b00554d00e,
_id: 552f6f7435828478156f6103,
notes: []
}
]
body.notes before merging :
[
{
content: '<p>testing</p>',
date: Thu Apr 16 2015 10:14:44 GMT+0200 (Rom, sommertid),
writer: 55193679026666b00554d00e,
_id: 552f6f7435828478156f6103,
notes: []
},
{
content: '<p>bla bla</p>',
date: '2015-04-16T08:25:24.431Z',
writer: 55193679026666b00554d00e
}
]
notes after merging :
[
{
content: '<p>testing</p>',
date: Thu Apr 16 2015 10:14:44 GMT+0200 (Rom, sommertid),
writer: 55193679026666b00554d00e,
_id: 552f6f7435828478156f6103,
notes: []
},
{
content: '<p>testing</p>',
date: Thu Apr 16 2015 10:14:44 GMT+0200 (Rom, sommertid),
writer: 55193679026666b00554d00e,
_id: 552f6f7435828478156f6103,
notes: []
}
]
答案 0 :(得分:1)
尝试使用 _.extend
或_.assign
代替:
var updated = _.assign(entry, req.body);
ShitalShah的 answer 突出显示了合并和扩展之间的差异,这种差异导致合并后的对象产生重复,但基本上是:
以下是extend / assign的工作原理:对于源中的每个属性,复制它 价值按原样到达目的地。如果属性值本身是对象, 它们的属性没有递归遍历。整个对象 将从源头获取并设置到目的地。
以下是合并的工作原理:对于源中的每个属性,请检查是否存在 财产是对象本身。如果它然后递归下来并尝试 将子对象属性从源映射到目标。所以 基本上我们将对象层次结构从源合并到目标。 而对于extend / assign,它是简单的一级属性副本 来源目的地。
JSBin 来说明差异:
var dest = {
p: { x: 10, y: 20},
};
var src = {
p: { x: 20, z: 30},
};
console.log(_.merge(dest, src));
/*
[object Object] {
p: [object Object] {
x: 20,
y: 20,
z: 30
}
}
*/
console.log(_.extend(dest, src));
/*
[object Object] {
p: [object Object] {
x: 20,
z: 30
}
}
*/