2016-03-24 16 views
0

複雑なJSON、私はこの配列(キーに値をキーと値を回す)を再構築するには、以下のような(「MM」内の任意の値をハードコーディングすることはできません必要解析と私は以下のような配列を持っている

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

を構築私は、これは自分自身を行って取得しようとしながら、効率的な解決策を見つけた場合や「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

この提案では、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

私にはありません本当に下に「値をハードコードできません」という意味に立っていますが、とにかくの例のソリューションを共有すると思いました。私は実際にパフォーマンスのためにそれを最適化していません:それは主に一般的な方向を示すことです。

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

次の時間あなたが尋ねる前に、まず自分のためにしようとした場合、それはおそらく最善です。そうすれば、あなたの質問は少し広範囲になる可能性があります。

+0

感謝。これをただ1つのループサイクルで作成しようとすると、パフォーマンスが向上します。しかし、もう一度あなたに感謝します。 – vardha

+0

あなたはようこそ!それはあなたが1つのループでそれを行うことができるかどうかを確認するために素晴らしいチャレンジです。しかし、実際にそれが価値があるかどうかを確認してください。私はあなたがそれを行うために '最も遅い方法'のベンチマークとしてこの方法を使用することができると思います。それを書き直し、どのくらい速くそれが得ることができる参照してください:) – user3297291

関連する問題