D3.js d3堆栈的数据转换

D3.js d3堆栈的数据转换,d3.js,D3.js,我正在尝试重新调整我的数据以使用d3堆栈生成器运行。下面的代码可以工作,但会生成重复的代码,看起来冗长乏味。有没有更好的方法来实现这一转变 From: data = {code: "sjp", year: 2020, credit: 12}, {code: "sjp", year: 2019, credit: 18}, {code: "sjp", year: 2018, credit: 10}, {cod

我正在尝试重新调整我的数据以使用d3堆栈生成器运行。下面的代码可以工作,但会生成重复的代码,看起来冗长乏味。有没有更好的方法来实现这一转变

   From: data  = {code: "sjp", year: 2020, credit: 12},
    {code: "sjp", year: 2019, credit: 18},
    {code: "sjp", year: 2018, credit: 10},
    {code: "anp", year: 2020, credit: 16},
    {code: "anp", year: 2019, credit: 14},
    {code: "anp", year: 2018, credit: 12}


  To: data = {code: "sjp" , y2020: 12, y2019: 18, y2018: 10},
   {code: "anp" , y2020: 16, y2019: 14, y2018: 12}


keyz = d3.map(d, function(s){return(s.code)})
  
keyz.forEach(function (d) {
  var item = d.filter(function (e) { return e.code === d})
    
  for (var i = 0; i < item.length; i++) {
               switch(d[i].year) {
                       case "2020":              
                           y2020 = item[i].credit
                           break;
                       case "2019":                
                           y2019 = item[i].credit
                           break;
                       case "2018":          
                           y2018 = item[i].credit 
               }                     
     }                                          
  
     Newarray.push({"code": d, "y2020": y2020,"y2019":y2019, "y2018": y2018, "y2017":y2017, "y2016": y2016, "y2015":y2015})
From:data={code:“sjp”,年份:2020,学分:12},
{代码:“sjp”,年份:2019,信用证:18},
{代码:“sjp”,年份:2018,学分:10},
{代码:“anp”,年份:2020,学分:16},
{代码:“anp”,年份:2019,信用证:14},
{代码:“anp”,年份:2018,学分:12}
To:data={代码:“sjp”,y2020:12,y2019:18,y2018:10},
{代码:“anp”,y2020:16,y2019:14,y2018:12}
keyz=d3.map(d,函数{return(s.code)})
键forEach(函数(d){
var item=d.filter(函数(e){返回e.code==d})
对于(变量i=0;i
那么:


let data=[{代码:“sjp”,年份:2020,学分:12},
{代码:“sjp”,年份:2020,学分:12},
{代码:“sjp”,年份:2019,信用证:18},
{代码:“sjp”,年份:2019,信用证:18},
{代码:“sjp”,年份:2018,学分:10},
{代码:“sjp”,年份:2018,学分:10},
{代码:“anp”,年份:2020,学分:16},
{代码:“anp”,年份:2020,学分:16},
{代码:“anp”,年份:2019,信用证:14},
{代码:“anp”,年份:2019,信用证:14},
{代码:“anp”,年份:2018,学分:12}];
让obj={};//创建一个“dictionary”对象
forEach(函数(d){//循环数据
if(!obj[d.code])obj[d.code]={code:d.code};//查看字典中是否存在“code”键,如果不存在,请添加它
如果(!obj[d.code]['y'+d.year])obj[d.code]['y'+d.year]=0;//我们第一次看到年份初始化为0;
obj[d.code]['y'+d.year]+=d.credit;//检索此代码和年份的字典值并添加值
})
console.log(Object.values(obj));//只获取字典中作为数组的值

谢谢。那太好了。你能解释一下代码吗?我不明白这些年的迭代是如何工作的,但它完成了任务。@user3359706,在代码中添加了注释。如果仍然不清楚,请告诉我。太好了。这可能是一个后续问题,除非有简单的答案?如果我为一个sp添加多个条目具体年份。是否可以求和?我尝试添加+=但没有效果。@user3359706,请参阅上面的更新。完美。只需要在初始化为0行上使用{}。有趣的是,我尝试将此与数据获取结合起来,但它只返回最后一项。const电子表格=wait d3.tsv(url)。然后(data=>data.forEach)(…在这种情况下,似乎没有为每个d更新obj?