_.merge克隆子文档而不是更新

时间:2015-04-16 08:39:49

标签: javascript angularjs mongodb merge lodash

在我的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: [] 
    }
]

1 个答案:

答案 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
  }
}
*/