D3.js 结合数据获取和数组迭代

D3.js 结合数据获取和数组迭代,d3.js,D3.js,只是尝试优化一些代码,发现示例2中的例程不起作用,只返回最后一项!知道为什么obj没有为每个人更新吗 例1 const spreadsheet = await d3.tsv(url).then(data => data.forEach(function (d) { let names =[]; return names.push({"code": d.Code, "date": d.Date})

只是尝试优化一些代码,发现示例2中的例程不起作用,只返回最后一项!知道为什么obj没有为每个人更新吗

例1

const spreadsheet = await d3.tsv(url).then(data => data.forEach(function (d) { 
let names =[];                       
    return names.push({"code": d.Code, "date": d.Date})
  
     }))                                                                                                  
   
return names;
例2

let obj = {};
const spreadsheet = await d3.tsv(url).then(data => data.forEach(function (d) { 
     
        if (!obj[d.code]) obj[d.code] = {code: d.code};          
             obj[d.code]['date'] = d.Date;        
           
      })
    
  return Object.values(obj)
}

由于在使用wait和.then()时存在误解,导致出现此错误

如果您使用.then()处理承诺,则无需等待承诺。wait关键字的存在是为了避免使用.then()

重新构造代码以删除.then(),我们有:

让obj={};
const电子表格=wait d3.tsv(url);
电子表格.forEach(功能(d){
如果(!obj[d.code])obj[d.code]={code:d.code};
obj[d.code][“日期”]=d.date;
});
console.log(obj);//反对
然而。如果是这种情况,这意味着您必须坚持使用.then(),并且不能在回调之外访问数据。你应该:

d3.tsv(url)。然后((电子表格)=>{
设obj={};
电子表格.forEach(功能(d){
如果(!obj[d.code])obj[d.code]={code:d.code};
obj[d.code][“日期”]=d.date;
});
console.log(obj);//此处的对象
/*使用obj的所有内容都必须在.then()回调中调用*/
});

在上述两种方法中,obj变量都是一个JSON,其中键是代码,值是代码的整个对象,我认为这就是您正在寻找的优化。使用Object.values(obj)将只返回一个数组,与示例1完全相同。

您好,谢谢您的解释。然而,我仍在努力寻找一个可行的解决方案。与您的重组代码;返回Object.values(obj)像以前一样生成一个带有i项的数组。如果返回对象.values(obj)在内部执行,则结果未定义。