2014-10-16 2 views
1

Вот мой объект JavaScript. Я хочу иметь метод для динамического создания объекта, сгруппированного по одному или нескольким атрибутам. Параметр attrs представляет собой массив, который содержит некоторые атрибуты для группировки.javascript объект, сгруппированный по нескольким атрибутам с помощью js

var input= [ 
    {fistname:'Joe', age:'10', sex:'boy', class:'3'}, 
    {fistname:'Tom', age:'11', sex:'boy', class:'3'}, 
    {fistname:'Amily', age:'10', sex:'girl', class:'3'}, 
    {fistname:'Bob', age:'11', sex:'boy',class:'4'}, 
    {fistname:'Susan', age:'12', sex:'girl', class:'4'} 
] 

var attrs = ['age', 'class']; 

function json2group(input, attrs){...} 

Результат:

[ 
    { 
     label:'10', 
     groups:[ 
      { 
       label:'3', 
       groups:[ 
        {fistname:'Joe', age:'10', sex:'boy', class:'3'}, 
        {fistname:'Amily', age:'10', sex:'girl', class:'3'} 
       ] 
      } 
     ] 
    }, 
    { 
     label:'11', 
     groups:[ 
      { 
       label:'3', 
       groups:[ 
        {fistname:'Tom', age:'11', sex:'boy', class:'3'} 
       ] 
      }, 
      { 
       label:'4', 
       groups:[ 
        {fistname:'Bob', age:'11', sex:'boy',class:'4'} 
       ] 
      } 
     ] 
    }, 
    { 
     label:'12', 
     groups:[ 
      { 
       label:'4', 
       groups:[ 
        {fistname:'Susan', age:'12', sex:'girl', class:'4'} 
       ] 
      } 
     ] 
    } 
] 

Пожалуйста, помогите мне.

+1

Функция группеПо lodash должно помочь: https://lodash.com/docs#groupBy – Oliver

ответ

0

Вы можете попробовать Alasql библиотека, чтобы подготовить вашу сложную структуру.

Здесь я подготовил пример с двумя атрибутами:

var input= [ {fistname:'Joe', age:'10', sex:'boy', class:'3'}, 
      {fistname:'Tom', age:'11', sex:'boy', class:'3'} ]; 

function json2group(input, attr){ 
    var res1 = alasql('SELECT '+attr[0]+' AS label0,'+attr[1]+' AS label1, \ 
     ARRAY({label:'+attr[0]+',groups:_}) AS groups1 FROM ? GROUP BY label0,label1',[input]); 
    return alasql('SELECT label0 AS label, ARRAY({label:label1,groups:groups1}) \ 
     AS groups FROM ? GROUP BY label', [res1]); 
}; 

var res = json2group(input, ["age","class"]); 

Вы можете попробовать это in jsFiddle, он производит именно ваш результат.

+0

О, здорово! Благодаря! Я попробую! – zeder127

+0

Ваша структура данных результатов не является тривиальной, поэтому вы можете написать мне, и я могу вам помочь. – agershun

0

Вы можете использовать чистый JS.

var input = [ 
    {fistname:'Joe', age:'10', sex:'boy', class:'3'}, 
    {fistname:'Tom', age:'11', sex:'boy', class:'3'}, 
    {fistname:'Amily', age:'10', sex:'girl', class:'3'}, 
    {fistname:'Bob', age:'11', sex:'boy',class:'4'}, 
    {fistname:'Susan', age:'12', sex:'girl', class:'4'} 
]; 

var attrs = ['age', 'class']; 

function GroupByArbitraryNumOfGroup(array, attrs) { 
    var output = []; 
    for (var i = 0; i < array.length; ++i) { 
     var ele = array[i]; 
     var groups = output; 
     for (var j = 0; j < attrs.length; ++j) { 
      var attr = attrs[j]; 
      var value = ele[attr]; 
      var gs = groups.filter(function(g) { 
       return g.hasOwnProperty('label') && g['label'] == value; 
      }); 
      if (gs.length == 0) { 
       var g = {}; 
       g['label'] = value; 
       g['groups'] = []; 
       groups.push(g); 
       groups = g['groups']; 
      } else { 
       groups = gs[0]['groups']; 
      } 
     } 
     groups.push(ele); 
    } 
    return output; 
} 

var o = GroupByArbitraryNumOfGroup(input, attrs); 

И вы получите o, как

[{ 
    'label': '10', 
    'groups': [{ 
     'label': '3', 
     'groups': [{ 
      'fistname': 'Joe', 
      'age': '10', 
      'sex': 'boy', 
      'class': '3' 
     }, { 
      'fistname': 'Amily', 
      'age': '10', 
      'sex': 'girl', 
      'class': '3' 
     }] 
    }] 
}, { 
    'label': '11', 
    'groups': [{ 
     'label': '3', 
     'groups': [{ 
      'fistname': 'Tom', 
      'age': '11', 
      'sex': 'boy', 
      'class': '3' 
     }] 
    }, { 
     'label': '4', 
     'groups': [{ 
      'fistname': 'Bob', 
      'age': '11', 
      'sex': 'boy', 
      'class': '4' 
     }] 
    }] 
}, { 
    'label': '12', 
    'groups': [{ 
     'label': '4', 
     'groups': [{ 
      'fistname': 'Susan', 
      'age': '12', 
      'sex': 'girl', 
      'class': '4' 
     }] 
    }] 
}]