在Express中使用_.extend()时,对象字段会被覆盖还是合并?
对象扩展时部分字段赋值的覆盖/新增问题
当将一个对象作为另一个对象的扩展,且仅为部分扩展字段赋值时,原有字段的值会被覆盖还是新增?
示例代码如下:
const PATCH_REQUEST_SCHEMA = { 'type': 'object', 'title': 'Some object', 'description': 'Some object Representation', 'properties': { 'name': { 'type': 'string', 'minLength': 1, 'maxLength': 256, 'title': 'Name' } } }; const POST_REQUEST_SCHEMA = _.extend({}, PATCH_REQUEST_SCHEMA, { 'properties': { 'surname': { 'type': 'string', 'minLength': 1, 'maxLength': 256, 'title': 'Surname' } } });
请问POST_REQUEST_SCHEMA.properties的结果会是包含name和surname的对象,还是仅包含surname的对象?
答案
_.extend是浅合并方法,它会直接覆盖目标对象中与源对象同名的属性值,不会递归合并嵌套的子对象。
所以在你的代码中:
- 原
PATCH_REQUEST_SCHEMA的properties是包含name的对象 - 扩展时传入的第三个参数直接给
properties赋值了一个新的仅含surname的对象 - 最终
POST_REQUEST_SCHEMA.properties仅包含surname,原有name被完全覆盖。
如果想要保留原有嵌套属性并新增字段,需要用Lodash的_.merge方法(递归合并嵌套对象),修改后的代码如下:
const POST_REQUEST_SCHEMA = _.merge({}, PATCH_REQUEST_SCHEMA, { 'properties': { 'surname': { 'type': 'string', 'minLength': 1, 'maxLength': 256, 'title': 'Surname' } } });
此时POST_REQUEST_SCHEMA.properties就会同时包含name和surname两个属性。
内容的提问来源于stack exchange,提问作者yanni
相关产品推荐
相关产品推荐

