json 将对象的子属性与另一个子对象合并

9ceoxa92  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(130)

我有一个json对象,看起来像下面这样:

{
   "client":null,
   "user":{
      "email":"[email protected]",
      "firstName":"Frank",
      "lastName":"Palto",
      "fullName":"Frank Palto",
      "tags":[
         "Ops",
         "Dev"
      ],
      "hasRegistered": true,
      "url":""
   },
   "user.email":"[email protected]",
   "user.firstName":"Joseph",
   "user.lastName":"Enoc",
   "user.mobileNumber":"0123451111"
}

我尝试将user对象与user之外的其他用户属性合并,以创建一个统一的user对象,如下所示:

{
   "client":null,
   "user":{
      "email":"[email protected]",
      "firstName":"Joseph",
      "lastName":"Enoc",
      "fullName":"Frank Palto",
      "mobileNumber":"0123451111",
      "tags":[
         "Ops",
         "Dev"
      ],
      "hasRegistered": true,
      "url":""
   }
}

请注意合并以及user之外的字段如何被置于user之下,并且其值具有优先级。
基本上,我想实现这一点,没有一个预定义的模型。当收到JSON时,我们应该通过检测“www.example.com“来检测离群值user.email(以与mustache表达式相同的方式),然后执行合并。
我已经看过其他类似的解决方案,但它们完全不能提供更适合我的用例的东西:How to merge properties of an object in an object
我如何才能最好地实现这一点?任何帮助都非常感谢

mutmk8jj

mutmk8jj1#

我认为最简单的解决方案是使用正则表达式解析键,然后使用产生的离群值使用括号符号重新分配给user属性。这里有一个函数,它一步一步地完成每个部分并记录结果(只是不要忘记也改变fullName。我也把它添加到函数中)。

function mergeOutliers(yourJSON) {
  console.log('initial JSON\n', yourJSON);
  
  const obj = JSON.parse(yourJSON);
  console.log('resulting object\n', obj);

  const keys = Object.keys(obj);
  console.log('all keys\n', keys);

  // could have also been done with key.startsWith('user.');
  const outlierKeys = keys.filter(key => key.match(/.+\..+/));
  console.log('outlier keys\n', outlierKeys);

  const fieldsToReplace = outlierKeys.map(key => key.replace('user.', ''));
  console.log('fields to replace\n', fieldsToReplace);

  for (field of fieldsToReplace) {
    obj.user[field] = obj[`user.${field}`];
    delete obj[`user.${field}`];
  }

  obj.user.fullName = `${obj.user.firstName} ${obj.user.lastName}`;
  console.log('merged object\n', obj);
}

下面是一个Codepen,它在你的JSON字符串上测试它:https://codepen.io/SonicBoomNFA/pen/gOZqgMq

相关问题