2016-07-25 101 views
0

我有看起来像这样,显示合格率按组织逐年一些CSV数据:如何简化这个D3代码?

org,org_cat,2004_passed,2004_total,2005_passed,2005_total,2006_passed,2006_total 
GSK,industry,35,100,45,100,55,100 

我在D3的工作,和我想要的组织就像一本字典落得这样的:

data = { 
'GSK': { 
    'org_cat': 'industry', 
    'data': [ 
     { 'year': 2004, 'passed': 35, 'total': 100 }, 
     { 'year': 2005, 'passed': 45, 'total': 100 }, 
     { 'year': 2006, 'passed': 55, 'total': 100 } 
    ] 
    ] 
} 

这其中大部分是简单的,但我有非常乱码年度列:

var data = {}; 
allData.forEach(function(d) { 
    data[d.org] = { 
    'category': d.org_cat, 
    'data': [] 
    }; 
    for (var k in d) { 
    var temp = {}; 
    for (var k in d) { 
     if (patt.test(k)) { 
     var res = k.split("_"); 
     if (res[0] in temp) { 
      temp[res[0]][res[1]] = +d[k]; 
     } else { 
      temp[res[0]] = {}; 
      temp[res[0]][res[1]] = +d[k]; 
     } 
     } 
    } 
    var tempArr = []; 
    for (var y in temp) { 
     var tempDict = {}; 
     tempDict.year = y; 
     tempDict.passed = temp[y].passed; 
     tempDict.total = temp[y].total; 
     tempArr.push(tempDict); 
    } 
    // TODO: sort by year in case the keys got shuffled 
    data[d.org].data = tempArr; 
    } 
}); 

有没有办法简化这个horri d代码?

假设每一行都是唯一的组织是安全的。

+0

退房d3.nest? – reptilicus

+1

其实我收回了那个,数据很混乱 – reptilicus

+0

@reptilicus我知道,这不是我的数据! – Richard

回答

2

我不明白你为什么需要D3来做到这一点。你的代码也不会使用它。这是我会怎么做,我敢肯定有另一种更简单的方式,但它可以帮助你任何一种方式:

的jsfiddle:https://jsfiddle.net/thatOneGuy/dnvheznk/1/

我转换数据,以JSON用的jsfiddle使用,但你已经知道如何通过CSV循环,使刚刚覆盖14行:

for (var i = 0; i < data.length; i++) { //loop through data array (this is so you can use this on a bigger sized array) 

要你的循环:

allData.forEach(function(d, i) { //but add the 'i' to index 

这里是转换JSO完全注释代码N个数据:

var data = [{ //data set converted to JSON for easier use 
 
    "org": "GSK", 
 
    "org_cat": "industry", 
 
    "2004_passed": 35, 
 
    "2004_total": 100, 
 
    "2005_passed": 45, 
 
    "2005_total": 100, 
 
    "2006_passed": 55, 
 
    "2006_total": 100 
 
}]; 
 

 
var newData = {}; //new data container 
 

 
for (var i = 0; i < data.length; i++) { //loop through data array (this is so you can use this on a bigger sized array) 
 
    var thisObj = {}; //create empty object 
 
    thisObj.org_cat = data[i].org_cat; //set org_cat 
 
    thisObj.data = []; //set data to empty array to populate later 
 

 
    for (var key in data[i]) { //loop through data[i] 
 
    if (key != 'org' && key != 'org_cat') { //check this key is not org or org_cat 
 
     var thisData = {}; //create empty data object 
 
     var thisYear = key.toString().substring(0, 4); //get year by using substring 
 

 
     thisData.year = thisYear; //set year 
 
     thisData.passed = data[i][thisYear + '_passed']; //set passed at this year 
 
     thisData.total = data[i][thisYear + '_total']; //set total at this year 
 

 
     thisObj.data.push(thisData); //push this data to data array 
 
    } 
 
    } 
 
    var uniqueDates = []; //set empty array to use to remove duplicate items in data array 
 
    for (var j = 0; j < thisObj.data.length; j++) { //loop through data array created earlier 
 
    if (uniqueDates.indexOf(thisObj.data[j].year) < 0) { //if this year doesn't exist in unique array above, push it in 
 
     uniqueDates.push(thisObj.data[j].year); //push it in 
 
    } else { 
 
     thisObj.data.splice(j--, 1); //remove duplicate data 
 
    } 
 
    } 
 
    newData[data[i].org] = thisObj; //set data @ current org to be object created above 
 
} 
 
console.log('newData', newData) //log new data

+0

谢谢 - 是的,使用D3不是强制性的,只是认为它可能会简化事情! – Richard