解析并构造一个复杂的json

时间:2016-03-24 16:48:14

标签: javascript arrays json parsing nested

我有一个如下所示的数组,

array=[ 
  { 'mm': '1', exp: 'exp1' },
  { 'mm': '2', exp: 'exp2' },
  { 'mm': [ '1', '3', '7' ], exp: 'exp3' },
  { 'mm': [ '1', '2', '4', '6' ], exp: 'exp4' },
  { 'mm': [ '1', '3', '2' ], exp: 'exp5' },
  { 'mm': [ '8', '2', '9' ], exp: 'exp6' },
  { 'mm': [ '4', '7', '1', '2' ], exp: 'exp7' },
  { 'mm': [ '5', '6', '2', '4', '3', '8', '1' ], exp: 'exp8' } 
]

我需要重新组织这个数组(将键转换为值和值到键),如下所示(不能硬编码'mm'或'exp'键中的任何值,因为它们总是不断变化,

    [ 
      { 'mm': '1', exp: ['exp1','exp3','exp4',','exp5','exp7','exp8'] },
      { 'mm': '2', exp: ['exp2','exp4','exp5','exp6','exp7','exp8'] },
      { 'mm': '3', exp: ['exp3','exp5','exp8'] },
      { 'mm':'4', exp:['exp4','exp7','exp8'] },
      { 'mm':'5', exp:['exp8'] },
      { 'mm':'6', exp:['exp4','exp8'] },
      { 'mm':'7', exp: ['exp3','exp7'] },
      { 'mm':'8', exp: ['exp6','exp8] },
      { 'mm':'9', exp: ['exp6'] }
] 

如果你找到了一个有效的解决方案,我自己就会明白这个想法。我试着自己完成这个工作。

2 个答案:

答案 0 :(得分:2)

此提议使用两个嵌套循环和一个对象来引用结果数组的右元素。

var array = [{ 'mm': '1', exp: 'exp1' }, { 'mm': '2', exp: 'exp2' }, { 'mm': ['1', '3', '7'], exp: 'exp3' }, { 'mm': ['1', '2', '4', '6'], exp: 'exp4' }, { 'mm': ['1', '3', '2'], exp: 'exp5' }, { 'mm': ['8', '2', '9'], exp: 'exp6' }, { 'mm': ['4', '7', '1', '2'], exp: 'exp7' }, { 'mm': ['5', '6', '2', '4', '3', '8', '1'], exp: 'exp8' }],
    pivot = function (array) {
        var r = [], o = {};
        array.forEach(function (a) {
            [].concat(a.mm).forEach(function (b) {
                if (!o[b]) {
                    o[b] = { mm: b, exp: [] };
                    r.push(o[b]);
                }
                o[b].exp.push(a.exp);
            });
        });
        return r;
    }(array);

document.write('<pre>' + JSON.stringify(pivot, 0, 4) + '</pre>');

答案 1 :(得分:1)

我真的不明白你的意思是'不能对任何值进行硬编码',但我认为无论如何我都会分享一个示例解决方案。我没有真正优化它的性能:它主要是为了显示一个大方向。

var data =[ 
  { 'mm': '1', exp: 'exp1' },
  { 'mm': '2', exp: 'exp2' },
  { 'mm': [ '1', '3', '7' ], exp: 'exp3' },
  { 'mm': [ '1', '2', '4', '6' ], exp: 'exp4' },
  { 'mm': [ '1', '3', '2' ], exp: 'exp5' },
  { 'mm': [ '8', '2', '9' ], exp: 'exp6' },
  { 'mm': [ '4', '7', '1', '2' ], exp: 'exp7' },
  { 'mm': [ '5', '6', '2', '4', '3', '8', '1' ], exp: 'exp8' } 
];

var tempData = {};
var newData = [];

data.forEach(function(dataPoint) {
    var arrPoint = {
        mm: [].concat(dataPoint.mm),
        exp: [].concat(dataPoint.exp)
    };

    arrPoint.mm.forEach(function (code) {
        if (!tempData[code]) {
            tempData[code] = {
                mm: code,
                exp: []
            }
        }

        var vals = tempData[code].exp;

        arrPoint.exp.forEach(function(val) {
            if (vals.indexOf(val) === -1) {
                vals.push(val);
            }
        });

    });
});


for (var propName in tempData) {
    if (tempData.hasOwnProperty(propName)) {
        newData.push(tempData[propName]);
    }
}

document.write(JSON.stringify(newData));

下次,在你问之前,最好先尝试自己。这样,你的问题可能会有点宽泛......