如何通过与模型比较将特定的缺失字段添加到 json 对象
Posted
技术标签:
【中文标题】如何通过与模型比较将特定的缺失字段添加到 json 对象【英文标题】:How to add specific missing fields to a json object by comparing with a model 【发布时间】:2020-01-07 00:26:30 【问题描述】:我正在为我的应用程序使用 nodejs、couchdb。将来,如果我想检查我的文档是否与模型相同,我正在考虑获取所有文档并与模型或模式进行比较,并将缺少的字段添加到文档中为 null 并更新它.如何比较并找出特定的缺失字段并将其添加到文档(json对象)中。
模型/架构
"_id": "",
"email": "",
"password": "",
"mobile": "",
"username": "",
"sharedNetworksArr": []
获取文档后,如果某些文档如下所示,我必须添加缺少的字段。
"_id": "1",
"email": "abc@gmail.com",
"password": "abc",
"username": "abc"
输出应该是,
"_id": "1",
"email": "abc@gmail.com",
"password": "abc",
"mobile": "",
"username": "abc",
"sharedNetworksArr": []
注意
所有文档可能不会遗漏相同的字段,并且某些文档可能与输出完全相同。
【问题讨论】:
【参考方案1】:您可以为模型提供默认值。或者您应该为其他添加必填字段。
"_id": "", "email": "", "password": "", "mobile": "", "username": "",
"sharedNetworksArr": default:[]
【讨论】:
【参考方案2】:您可以为此使用 lodash 的 defaultsdeep(或只是默认)库。
const _defaultsDeep = require('lodash.defaultsdeep');
let base =
"_id": "",
"email": "",
"password": "",
"mobile": "",
"username": "",
"sharedNetworksArr": []
;
let input =
"_id": "1",
"email": "abc@gmail.com",
"password": "abc",
"username": "abc"
;
let merged = _defaultsDeep(input, base);
console.log(JSON.stringify(merged, null, 2));
【讨论】:
对于输入数组,您可以使用像 forEach 这样的数组操作。我还警告不要在不考虑影响的情况下在 map 函数中使用扩展运算符。这实际上每次都构造一个新对象,而不是修改现有对象。【参考方案3】:你可以像这样使用 ES6 扩展运算符
如果您使用单个对象
// Model/Scheme Object
const modelObject =
"_id": "",
"email": "",
"password": "",
"mobile": "",
"username": "",
"sharedNetworksArr": []
;
// document returned object
const documentObject =
"_id": "1",
"email": "abc@gmail.com",
"password": "abc",
"username": "abc"
;
/*
Get the result using ES6 spread operator by passing
the model object first, and the document object second
*/
const outputObject = ...modelObject, ...documentObject ;
console.log(outputObject);
/*
_id: '1',
email: 'abc@gmail.com',
password: 'abc',
mobile: '',
username: 'abc',
sharedNetworksArr: []
*/
如果您使用的是对象数组。使用数组映射运算符转换结果
const documentObjectArray = [
"_id": "1",
"email": "abc@gmail.com",
"password": "abc",
"username": "abc"
,
"_id": "2",
"email": "def@gmail.com",
"password": "def",
"username": "def"
,
"_id": "3",
"email": "ghi@gmail.com",
"password": "ghi",
"username": "ghi"
];
const outputObjectArray = documentObjectArray.map((document) =>
/* transform result using ES6 spread operator by passing
the model object first, and the document object second */
return ...modelObject, ...document,
);
console.log(outputObjectArray);
/*
[ _id: '1',
email: 'abc@gmail.com',
password: 'abc',
mobile: '',
username: 'abc',
sharedNetworksArr: [] ,
_id: '2',
email: 'def@gmail.com',
password: 'def',
mobile: '',
username: 'def',
sharedNetworksArr: [] ,
_id: '3',
email: 'ghi@gmail.com',
password: 'ghi',
mobile: '',
username: 'ghi',
sharedNetworksArr: [] ]
*/
【讨论】:
这个答案简单,优雅,不使用任何外部库,除非您需要支持嵌套对象,否则它应该可以工作。 这很简单并且工作正常。接受你的回答。 @Kola- 与模型比较我们可以使用它来删除字段吗?? @VenuraNimesh 请让我知道您的确切意思。它是从 modelObject 还是从 documentObject 中删除?干杯! @Grey 就像通过与模型比较在文档对象中添加字段一样,如果文档对象中有一个附加字段(与模型比较时),是否有任何ES6运算符要删除来自文档对象的附加字段。以上是关于如何通过与模型比较将特定的缺失字段添加到 json 对象的主要内容,如果未能解决你的问题,请参考以下文章