2016-05-02 106 views
-4

我有一个数据源中的形式抽出的数据:降低JSON数据

arr = [{ 
"type": "engineering", 
"name": "Physics", 
"name_id": 6, 
"strength": [21,33,12], 
"batch": 191 
}, { 
"type": "engineering", 
"name": "Computer and Mathematics", 
"name_id": 8, 
"strength": [1,3], 
"batch": 192 
}, { 
"type": "engineering", 
"name": "Computer and Mathematics", 
"name_id": 8, 
"strength": [1,33], 
"batch": 193 
}, { 
"type": "engineering", 
"name": "Physics", 
"name_id": 6, 
"strength": [2,33], 
"batch": 194 
}, { 
"type": "mbbs", 
"name": "Surgery", 
"name_id": 16, 
"strength": [21,3], 
"batch": 195 
}, { 
"type": "mbbs", 
"name": "Dental", 
"name_id": 26, 
"strength": [21,3], 
"batch": 196 
}, { 
"type": "mbbs", 
"name": "Dental", 
"name_id": 26, 
"strength": [21,33,43], 
"batch": 197 
}] 

按我的要求,我必须将数据推到一个数组具有以下格式:

[{ 
"engineering": { 
    "subject": [{ 
     "name":{ 
      "name": "Physics", 
      "name_id": 6 
     }, 
     "class":{ 
      "batch": [191,194], 
      "strength":[21,33,12,2,33] 
     } 
    }, 
     { 
      "name":{ 
       "name": "Computer and Mathematics", 
       "name_id": 8 
      }, 
      "class":{ 
       "batch": [192,193], 
       "strength":[1,3,1,33] 
      } 
     }], 
}, 
"mbbs":{ 
    "subject": [{ 
     "name":{ 
      "name": "Surgery", 
      "name_id": 16 
     }, 
     "class":{ 
      "batch": 195, 
      "strength":[21,3,195] 
     } 
    }, 
     { 
      "name":{ 
       "name": "Dental", 
       "name_id": 8 
      }, 
      "class":{ 
       "batch": [196,197], 
       "strength":[21,3,21,33,43] 
      } 
     }], 
    } 
    }] 

我想用上面给出的格式对数据进行分类。基本上它会创建两个类别,Engineeringmbbs。 我希望对此有任何指导。我的解决方案的工作原理,但在一些记录的情况下,我不明白为什么我所有的数据都没有迭代。 我正在使用forEach循环。

+5

哪里是你说的这个'forEach'循环? –

+3

你将不得不提供你已经尝试过的。我真的怀疑有人会从头开始编写这段代码。 – Paran0a

+0

你是否想让任何人完成你的代码:) –

回答

2

具有单个循环和临时对象的提议。

var arr = [{ "type": "engineering", "name": "Physics", "name_id": 6, "strength": [21, 33, 12], "batch": 191 }, { "type": "engineering", "name": "Computer and Mathematics", "name_id": 8, "strength": [1, 3], "batch": 192 }, { "type": "engineering", "name": "Computer and Mathematics", "name_id": 8, "strength": [1, 33], "batch": 193 }, { "type": "engineering", "name": "Physics", "name_id": 6, "strength": [2, 33], "batch": 194 }, { "type": "mbbs", "name": "Surgery", "name_id": 16, "strength": [21, 3], "batch": 195 }, { "type": "mbbs", "name": "Dental", "name_id": 26, "strength": [21, 3], "batch": 196 }, { "type": "mbbs", "name": "Dental", "name_id": 26, "strength": [21, 33, 43], "batch": 197 }], 
 
    grouped = []; 
 

 
arr.forEach(function (a) { 
 
    var o = {}; 
 
    if (!this.type[a.type]) { 
 
     o[a.type] = { subject: [] }; 
 
     this.type[a.type] = o[a.type].subject; 
 
     grouped.push(o); 
 
    } 
 
    if (!this.name[a.name_id]) { 
 
     this.name[a.name_id] = { "name": { "name": a.name, "name_id": a.name_id }, "class": { "batch": undefined, "strength": [] } }; 
 
     this.type[a.type].push(this.name[a.name_id]); 
 
    } 
 
    if (typeof this.name[a.name_id].class.batch === 'number') { 
 
     this.name[a.name_id].class.batch = [this.name[a.name_id].class.batch]; 
 
    } 
 
    Array.isArray(this.name[a.name_id].class.batch) && this.name[a.name_id].class.batch.push(a.batch); 
 
    if (this.name[a.name_id].class.batch === undefined) { 
 
     this.name[a.name_id].class.batch = a.batch; 
 
    } 
 
    this.name[a.name_id].class.strength = this.name[a.name_id].class.strength.concat(a.strength); 
 
}, { type: Object.create(null), name: Object.create(null) }); 
 

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

+0

虽然有点bug,但如果在mbbs和engineering中name_id都是相同的,我们将在mbbs上主题 – nyxem1

+0

@ nyxem1,现在type和name都有自己的命名空间。 –

2

试试这个办法

var map = {}; 
arr.forEach(function(val){ 
    map[ val.type ] = map[ val.type ] || {}; 
    map[ val.type ][ "subject" ] = map[ val.type ][ "subject" ] || []; 
    map[ val.type ][ "subject" ][ val.name_id ] = map[ val.type ][ "subject" ][ val.name_id ] || { name : { name : val.name, name_id : val.name_id }, class : { batch : val.batch, strength : [] } }; 
    map[ val.type ][ "subject" ][ val.name_id ][ "class" ][ "strength" ] = map[ val.type ][ "subject" ][ val.name_id ][ "class" ][ "strength" ].concat(val.strength); 
}); 

现在这个地图已经聚集,只要你想,你可以简单地格式化,按您的要求

var output = Object.keys(map).map(function(val){ 
    map[val]["subject"] = map[val]["subject"].filter(function(val){ 
     return val 
    }); 
    return map[ val ]; 
}) 

DEMO

arr = [{ 
 
"type": "engineering", 
 
"name": "Physics", 
 
"name_id": 6, 
 
"strength": [21,33,12], 
 
"batch": 191 
 
}, { 
 
"type": "engineering", 
 
"name": "Computer and Mathematics", 
 
"name_id": 8, 
 
"strength": [1,3], 
 
"batch": 192 
 
}, { 
 
"type": "engineering", 
 
"name": "Computer and Mathematics", 
 
"name_id": 8, 
 
"strength": [1,33], 
 
"batch": 193 
 
}, { 
 
"type": "engineering", 
 
"name": "Physics", 
 
"name_id": 6, 
 
"strength": [2,33], 
 
"batch": 194 
 
}, { 
 
"type": "mbbs", 
 
"name": "Surgery", 
 
"name_id": 16, 
 
"strength": [21,3], 
 
"batch": 195 
 
}, { 
 
"type": "mbbs", 
 
"name": "Dental", 
 
"name_id": 26, 
 
"strength": [21,3], 
 
"batch": 196 
 
}, { 
 
"type": "mbbs", 
 
"name": "Dental", 
 
"name_id": 26, 
 
"strength": [21,33,43], 
 
"batch": 197 
 
}] 
 

 
    var map = {}; 
 
    arr.forEach(function(val){ 
 
     map[ val.type ] = map[ val.type ] || {}; 
 
     map[ val.type ][ "subject" ] = map[ val.type ][ "subject" ] || []; 
 
     map[ val.type ][ "subject" ][ val.name_id ] = map[ val.type ][ "subject" ][ val.name_id ] || { name : { name : val.name, name_id : val.name_id }, class : { batch : val.batch, strength : [] } }; 
 
     map[ val.type ][ "subject" ][ val.name_id ][ "class" ][ "strength" ] = map[ val.type ][ "subject" ][ val.name_id ][ "class" ][ "strength" ].concat(val.strength); 
 
    }); 
 

 

 
var output = Object.keys(map).map(function(val){ 
 
     map[val]["subject"] = map[val]["subject"].filter(function(val){ 
 
      return val 
 
     }); 
 
     return map[ val ]; 
 
    }) 
 
    
 
document.body.innerHTML += JSON.stringify(output, 0, 4);