如何通过与模型比较将特定的缺失字段添加到 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 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django rest 框架中仅使用特定变体对象将项目添加到愿望清单?

如何在 Django 中向模型添加临时字段?

如何区分空值字段与杰克逊库中的缺失字段

将 json 模型字段与 django 石墨烯一起使用

使用数据绑定从SAPUI5多输入字段中删除令牌

如何查询 django JSON 字段中的特定字段