首页 > 解决方案 > 将 json 数据与 javascript 合并

问题描述

我有一个这样的 JSON 文件。 我需要合并来自同一证书名称的名称和值。

使用 javascript 执行此操作的最佳方法是什么?

    [
        {
          certname: 'server1',
          environment: 'acceptance',
          name: 'clientcert',
          value: 'server1'
        },
        {
          certname: 'server2',
          environment: 'acceptance',
          name: 'clientcert',
          value: 'server2'
        },
        {
          certname: 'server3',
          environment: 'acceptance',
          name: 'clientcert',
          value: 'server3'
        }
    ],
    ]    
        {
          certname: 'server1',
          environment: 'acceptance',
          name: 'operatingsystem',
          value: 'windows'
        },
        {
          certname: 'server2',
          environment: 'acceptance',
          name: 'operatingsystem',
          value: 'windows'
        },
        {
          certname: 'server3',
          environment: 'acceptance',
          name: 'operatingsystem',
          value: 'RedHat'
        }
   ],
   [
        {
          certname: 'server1',
          environment: 'acceptance',
          name: 'operatingsystemmajrelease',
          value: '2008 R2'
        },
        {
          certname: 'server2',
          environment: 'acceptance',
          name: 'operatingsystemmajrelease',
          value: '2008 R2'
        },
        {
          certname: 'server3',
          environment: 'acceptance',
          name: 'operatingsystemmajrelease',
          value: '6'
        }
    ],
    [
        {
          certname: 'server1',
          environment: 'acceptance',
          name: 'clientversion',
          value: '5.5.2'
        },
        {
          certname: 'server2',
          environment: 'acceptance',
          name: 'clientversion',
          value: '5.5.2'
        },
        {
          certname: 'server3',
          environment: 'acceptance',
          name: 'clientversion',
          value: '5.5.2'
        }
    ]

我需要合并来自同一证书名称的名称和值。

结果必须是:

var endresult= {
  0:{clientcert:"server1", operatingsystem:"windows", operatingsystemmajrelease: "2008 R2", clientversion: 5.5.2}, 
  1:{clientcert:"server2", operatingsystem:"windows", operatingsystemmajrelease: "2008 R2", clientversion: 5.5.2},
  2:{clientcert:"server3", operatingsystem:"RedHat", operatingsystemmajrelease: 6, clientversion: 5.5.2},
};

或者

{
  clientcert: 'server3',
  operatingsystem: 'windows',
  operatingsystemmajrelease: '2008 R2',
  clientversion: '5.5.2'
},
{
  clientcert: 'server2',
  operatingsystem: 'windows',
  operatingsystemmajrelease: '2008 R2',
  clientversion: '5.5.2'
},
{
  clientcert: 'server1',
  operatingsystem: 'RedHat',
  operatingsystemmajrelease: '6',
  clientversion: '5.5.2'
},

我不知道是否更容易合并回 json 格式或 JS 对象,这两种结果都很好。:-) 我需要将其合并到 SQL 数据库中,所以我认为 JSON 是最好的结果?

标签: javascriptjson

解决方案


const json = [{certname: 'server1',environment: 'acceptance',name: 'clientcert',value: 'server1'},{certname: 'server2',environment: 'acceptance',name: 'clientcert',value: 'server2'},{certname: 'server3',environment: 'acceptance',name: 'clientcert',value: 'server3'},{certname: 'server1',environment: 'acceptance',name: 'operatingsystem',value: 'windows'},{certname: 'server2',environment: 'acceptance',name: 'operatingsystem',value: 'windows'},{certname: 'server3',environment: 'acceptance',name: 'operatingsystem',value: 'RedHat'},{certname: 'server1',environment: 'acceptance',name: 'operatingsystemmajrelease',value: '2008 R2'},{certname: 'server2',environment: 'acceptance',name: 'operatingsystemmajrelease',value: '2008 R2'},{certname: 'server3',environment: 'acceptance',name: 'operatingsystemmajrelease',value: '6'},{certname: 'server1',environment: 'acceptance',name: 'clientversion',value: '5.5.2'},{certname: 'server2',environment: 'acceptance',name: 'clientversion',value: '5.5.2'},{certname: 'server3',environment: 'acceptance',name: 'clientversion',value: '5.5.2'},];

function format(json){
  const data = json.reduce((a, b) => {
    if(!a[b.certname]) a[b.certname] = {};
    a[b.certname][b.name] = b.value;
    return a;
  }, {});
  return Object.values(data);
}

console.log(format(json));

编辑: 根据更新的问题,输入拆分为子数组。要查看它,您可以:

  • 在转到上述解决方案之前合并所有内容,如下所示:

const json = [[{certname: 'server1',environment: 'acceptance',name: 'clientcert',value: 'server1'},{certname: 'server2',environment: 'acceptance',name: 'clientcert',value: 'server2'},{certname: 'server3',environment: 'acceptance',name: 'clientcert',value: 'server3'}],[{certname: 'server1',environment: 'acceptance',name: 'operatingsystem',value: 'windows'},{certname: 'server2',environment: 'acceptance',name: 'operatingsystem',value: 'windows'},{certname: 'server3',environment: 'acceptance',name: 'operatingsystem',value: 'RedHat'}],[{certname: 'server1',environment: 'acceptance',name: 'operatingsystemmajrelease',value: '2008 R2'},{certname: 'server2',environment: 'acceptance',name: 'operatingsystemmajrelease',value: '2008 R2'},{certname: 'server3',environment: 'acceptance',name: 'operatingsystemmajrelease',value: '6'}],[{certname: 'server1',environment: 'acceptance',name: 'clientversion',value: '5.5.2'},{certname: 'server2',environment: 'acceptance',name: 'clientversion',value: '5.5.2'},{certname: 'server3',environment: 'acceptance',name: 'clientversion',value: '5.5.2'}],];

function format(json){
  const data = json.reduce((a,b)=>[...a, ...b], []).reduce((a, b) => {
    if(!a[b.certname]) a[b.certname] = {};
    a[b.certname][b.name] = b.value;
    return a;
  }, {});
  return Object.values(data);
}

console.log(format(json));

  • 或者遍历 内部的子数组reduce,如下所示:

const json = [[{certname: 'server1',environment: 'acceptance',name: 'clientcert',value: 'server1'},{certname: 'server2',environment: 'acceptance',name: 'clientcert',value: 'server2'},{certname: 'server3',environment: 'acceptance',name: 'clientcert',value: 'server3'}],[{certname: 'server1',environment: 'acceptance',name: 'operatingsystem',value: 'windows'},{certname: 'server2',environment: 'acceptance',name: 'operatingsystem',value: 'windows'},{certname: 'server3',environment: 'acceptance',name: 'operatingsystem',value: 'RedHat'}],[{certname: 'server1',environment: 'acceptance',name: 'operatingsystemmajrelease',value: '2008 R2'},{certname: 'server2',environment: 'acceptance',name: 'operatingsystemmajrelease',value: '2008 R2'},{certname: 'server3',environment: 'acceptance',name: 'operatingsystemmajrelease',value: '6'}],[{certname: 'server1',environment: 'acceptance',name: 'clientversion',value: '5.5.2'},{certname: 'server2',environment: 'acceptance',name: 'clientversion',value: '5.5.2'},{certname: 'server3',environment: 'acceptance',name: 'clientversion',value: '5.5.2'}],];

function format(json){
  const data = json.reduce((a, b) => {
    b.forEach(t => {
      if(!a[t.certname]) a[t.certname] = {};
      a[t.certname][t.name] = t.value;
    })
    return a;
  }, {});
  return Object.values(data);
}

console.log(format(json));


推荐阅读