javascript - 将源 JSON 字符串合并到具有相似键但在 javascript 中具有不同结构的目标

标签 javascript arrays json string

我有两个 JSON 字符串,如下所示:

source = [
  {
    "name": "test1",
    "values": ["User Support"],
    "enabled": false
  },
  {
    "name": "test2",
    "values": ["M"],
    "enabled": true
  },
  {
    "name": "test3",
    "values": ["CA"],
    "enabled": false
  }
]
target = [{
    "name": "test1",
    "values": [{
        "value": "User Support",
        "selected": false
      },
      {
        "value": "Engineering",
        "selected": false
      },
      {
        "value": "Implementation",
        "selected": false
      }
    ],
    "enabled": false
  },
  {
    "name": "test2",
    "values": [{
        "value": "M",
        "selected": false
      },
      {
        "value": "F",
        "selected": false
      }
    ],
    "notEnabled": false
  },
  {
    "name": "test3",
    "values": [{
        "value": "CA",
        "selected": false
      },
      {
        "value": "EN",
        "selected": false
      }
    ],
    "enabled": false
  }
]
我想将这两个 JSON 字符串合并到目标中,结果应该如下所示:
target = [{
    "name": "test1",
    "values": [{
        "value": "User Support",
        "selected": true
      },
      {
        "value": "Engineering",
        "selected": false
      },
      {
        "value": "Implementation",
        "selected": false
      }
    ],
    "enabled": false
  },
  {
    "name": "test2",
    "values": [{
        "value": "M",
        "selected": true
      },
      {
        "value": "F",
        "selected": false
      }
    ],
    "enabled": true
  },
  {
    "name": "test3",
    "values": [{
        "value": "CA",
        "selected": true
      },
      {
        "value": "EN",
        "selected": false
      }
    ],
    "enabled": false
  }
]
因此,我要做的是在目标字符串中搜索名称为 test1、test2....,然后如果在源 JSON 字符串中找到该值,则将所选字段设置为 true。启用字段的情况也是如此。
我想到的第一件事是对每个循环使用嵌套并检查键。
在Javascript中还有其他更好的方法吗?
请注意,目标字符串中可能存在其他键,但除非它们存在于源字符串中,否则我们不会打扰它们。

最佳答案

如果你不介意lodash:

const _ = require('lodash');

const sourceJSON = '[{"name":"test1","values":["User Support"],"enabled":false},{"name":"test2","values":["M"],"enabled":true},{"name":"test3","values":["CA"],"enabled":false}]';
const targetJSON = '[{"name":"test1","values":[{"value":"User Support","selected":false}, {"value":"Engineering","selected":false},{"value":"Implementation","selected":false}],"enabled":false},{"name":"test2","values":[{"value":"M","selected":false},  {"value":"F","selected":false} ],"notEnabled":false},{ "name":"test3","values": [{"value":"CA","selected":false},{"value":"EN","selected":false}],"enabled":false}]';

const source = JSON.parse(sourceJSON);
const target = JSON.parse(targetJSON);

const sourceNormalized = source.map((obj) => (
  { ...obj, values: [{value: obj.values[0], selected: true}] }
));

const merged = _.defaultsDeep(sourceNormalized, target);
console.dir(merged, {depth: null});
// [ { name: 'test1',
//     values: [
//       { value: 'User Support', selected: true },
//       { value: 'Engineering', selected: false },
//       { value: 'Implementation', selected: false }
//     ],
//     enabled: false
//   },
//   { name: 'test2',
//     values: [ 
//       { value: 'M', selected: true }, 
//       { value: 'F', selected: false } 
//     ],
//     enabled: true,
//     notEnabled: false
//   },
//   { name: 'test3',
//     values: [
//       { value: 'CA', selected: true },
//       { value: 'EN', selected: false }
//     ],
//     enabled: false} ] 

result = JSON.stringify(merged);

关于javascript - 将源 JSON 字符串合并到具有相似键但在 javascript 中具有不同结构的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64567701/

相关文章:

javascript - 如何检索在 JavaScript 中触发事件的 html 对象的引用?

c++ - 为什么 std::array::size constexpr 具有简单类型(int,double,...)而不是 std::vector (GCC)?

java - 如何用随机字符串填充二维数组

c++ - 结构数组的指针范围和构造函数创建

python - 将所有python函数参数转换为json的快速方法

java - 读取Json文件但key没有引号

jquery - 在 Symfony 2 中接收 json 响应

javascript - 多个类与 Jquery 映射并加载内容

javascript - D3.js v5 - 在线性尺度上创建一个相对的、可缩放的类似时间轴的轴

javascript - JavaScript 可以从第三方域加载 XML 数据吗?