2016-03-24 9 views
0

i wie unten ein Feld haben,parsen und konstruieren ein kompliziertes json

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' } 
] 

i dieses Array restrukturieren müssen (drehen Tasten auf Werte und Werte Tasten) unterhalb dergleichen (nicht alle Werte in ‚mm‘ hard oder ‚exp‘ Schlüssel, wie sie immer ständig ändern,

[ 
     { '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'] } 
] 

Sie auf die Idee, hoffentlich wissen lemme, wenn Sie eine effiziente Lösung finden, während ich versuche, dies selbst getan.

Antwort

2

Dieser Vorschlag verwendet zwei verschachtelte Schleifen und ein Objekt für den Verweis auf das rechte Element des Ergebnisarrays.

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

ich nicht wirklich unter Stehe, was du meinst, 'kann keine Werte fest codieren', aber ich dachte, ich würde trotzdem eine Beispiel Lösung teilen. Ich habe es nicht wirklich für die Performance optimiert: Es soll hauptsächlich eine allgemeine Richtung zeigen.

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));

Das nächste Mal, dann ist es wahrscheinlich am besten, wenn Sie für sich selbst versuchen, bevor fragen. Auf diese Weise kann Ihre Frage etwas weniger weit gefasst sein.

+0

Dank für die Anregung. Ich versuche, dies in nur einem Zyklus zu schaffen, um die Leistung zu verbessern. aber danke nochmal. – vardha

+0

Gern geschehen! Es ist eine nette Herausforderung zu sehen, ob Sie es in einer Schleife machen können. Aber stellen Sie sicher, dass es sich lohnt. Ich denke, Sie können diese Methode als Benchmark für den "langsamsten Weg" verwenden. Schreibe es um und schau wie viel schneller es wird :) – user3297291