2016-03-23 6 views
1

私の配列は、この、は、ネストされたJSONオブジェクトに生のJSONを作成する - 私は、それぞれのチームに所属するネストされたオブジェクト(EXPSの#を作成する必要がある場合、私は、サーバーからダウンロードしたJavaScript

array=[ { icon: 'm-warning', 
    color: '#FDC204', 
    name: 'exp1', 
    team: 'c', 
    user: 'alpha' }, 
    { icon: 'm-puzzle', 
    color: '#86AF45', 
    name: 'exp2', 
    team: 'c', 
    user: 'alpha' }, 
    { icon: 'm-refresh', 
    color: '#77A746', 
    name: 'exp3', 
    team: 'c', 
    user: 'alpha' }, 
    { icon: 'm-puzzle', 
    color: '#86AF45', 
    name: 'exp3', 
    team: 'a', 
    user: 'beta' }, 
    { icon: 'm-clock', 
    color: '#4677A7', 
    name: 'exp4', 
    team: 'b', 
    user: 'beta' }, 
    { icon: 'm-warning', 
    color: '#FDC204', 
    name: 'exp5', 
    team: 'a', 
    user: 'gamma' } ] 

のように見え、上記の配列からどのように私はそれについて行くだろうか。私の結果のネストされたオブジェクトは、forループのカップルと、伝統的にこれを行うことができ、このようになります(予告アルファは、Cチームに所属3 EXPSを持っている)などなど

[{ 
    id: 'gamma', 
    data: [ 
    ['a', 1] 
    ] 
}, 
{ 
    id: 'beta', 
    data: [ 
    ['a', 1], 
    ['b', 1] 
    ] 
}, 
{ 
    id: 'alpha', 
    data: [ 
    ['c', 3] 
    ] 
}] 

shud。 forループサイクルを減らし、これを作成する簡単な方法があります。注意点は、これは私があるかもしれませんどのように多くのユーザー/チーム/ EXPS知らない厳格なJSでなければなりません。 50人の異なるユーザー/ 1000の異なる実験が存在する可能性がある。だから私は、任意のEXP名をハードコーディングすることはできません/ユーザー/など

+2

値としてIDSを中詰めしません。それらをキーとして使用します。 'data ['alpha']'は、いつもあなたの親配列をスキャンして 'id:alpha'のインデックスを調べるよりも簡単です。 –

+0

@MarcBなぜこのイベントを作成したいのですか?これは私が使用してサードパーティのチャートライブラリ形式でbecasue、 – vardha

答えて

1

この提案は、結果の配列の配列への参照のための一時的なオブジェクトを単一のループを使用しています。ここで

var array = [{ icon: 'm-warning', color: '#FDC204', name: 'exp1', team: 'c', user: 'alpha' }, { icon: 'm-puzzle', color: '#86AF45', name: 'exp2', team: 'c', user: 'alpha' }, { icon: 'm-refresh', color: '#77A746', name: 'exp3', team: 'c', user: 'alpha' }, { icon: 'm-puzzle', color: '#86AF45', name: 'exp3', team: 'a', user: 'beta' }, { icon: 'm-clock', color: '#4677A7', name: 'exp4', team: 'b', user: 'beta' }, { icon: 'm-warning', color: '#FDC204', name: 'exp5', team: 'a', user: 'gamma' }], 
 
    grouped = function (array) { 
 
     var o = {}, r = []; 
 
     array.forEach(function (a) { 
 
      if (!(a.user in o)) { 
 
       o[a.user] = { _: { id: a.user, data: [] } }; 
 
       r.push(o[a.user]._); 
 
      } 
 
      if (!(a.team in o[a.user])) { 
 
       o[a.user][a.team] = [a.team, 0]; 
 
       o[a.user]._.data.push(o[a.user][a.team]); 
 
      } 
 
      o[a.user][a.team][1]++; 
 
     }); 
 
     return r; 
 
    }(array); 
 

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

+1

これは美しいです期待しています。どうもありがとうございます – vardha

0

私はについて少し読みやすいとの理由であると感じArray.prototype.reduceとソリューションです。

let result = array.reduce((accumulated, value) => { 
    // find existing user 
    let user = accumulated.find(item => item.id === value.user) 
    if (user) { 
    // find existing team 
    let team = user.data.find(item => item[0] === value.team) 
    if (team) { 
     // existing team found, increase count 
     team[1]++ 
    } else { 
     // existing team not found, add team 
     user.data.push([ value.team, 1 ]) 
    } 
    } else { 
    // existing user not found, add user 
    accumulated.push({ 
     id: value.user, 
     data: [ 
     [ value.team, 1 ] 
     ] 
    }) 
    } 
    return accumulated 
}, []) // start with empty array 

Here is a jsbin to try it out in your browserです。

関連する問題