【问题标题】:Merging arrays that hold CSV data into one object array将保存 CSV 数据的数组合并到一个对象数组中
【发布时间】:2018-09-13 13:34:03
【问题描述】:

我从post 中获得了影响,将 CSV 文件存储在单独的数组中,并且它可以工作。我希望再添加大约 8 个数组,每个数组都包含 CSV 文件的内容。

但是我怎样才能将这些数组合并到一个对象数组中呢? 拥有一个对象数组对于我后续应用这些数组至关重要。到目前为止我的内容如下,但我不确定它是否正确?

任何帮助将不胜感激。

var dataCSV;
var dataCSV2;

var collection = {dataCSV, dataCSV2};

d3.csv("data/csv1.csv", function(data) {
    data.forEach(function(d) {
        d.word = d.word;
        d.frequency = +d.frequency;
})
    dataCSV = data;
    console.log(dataCSV);
});

d3.csv("data/csv2.csv", function(data) {
    data.forEach(function(d) {
        d.word = d.word;
        d.frequency = +d.frequency;
    })
    dataCSV2 = data;
    console.log(dataCSV2);
});

function merge(data1, data2) {
    collection = {data1, data2};
    console.log(collection);
}

merge(dataCSV, dataCSV2);

理想情况下,我希望 collection 的输出是:

collection {
    dataCSV {
        word: ..., frequency: ...,
        word: ..., frequency: ...
    },
    dataCSV2 {
        word: ..., frequency: ...,
        word: ..., frequency: ...
    }
 }

【问题讨论】:

  • 您一定要使用旧版本的 d3/d3-queue 吗?如果您升级到 v5,您的生活会更轻松。
  • 我不知道 V5 可用...我会调查一下。在 V5 中我需要什么样的解决方案?
  • 看看我的answer"Load multiple files using the d3-fetch module"d3-fetch 模块替换了 v5 中现已弃用的模块 d3-queue
  • @altocumulus 这很混乱,我可能需要发布另一个问题
  • 我链接到的答案中的解决方案与@OriDrori's answer提出的解决方案基本相同。但是,v5 让您的生活更轻松,因为 d3 使用 Fetch API 将自己返回 Promise,因此无需自己创建新的 Promise,即d3.csv 返回一个 Promise。这就是你在我的回答中看到的。相同的技术,只是更短。

标签: javascript arrays csv d3.js


【解决方案1】:

不要重复自己,而是创建一个获取数据、格式化数据并返回promise 的方法。然后使用Promise.all() 收集几个promise 的结果。然后你可以在一个对象中收集这两个数组。

示例(未测试):

const getCsv = (url) => new Promise((resolve) => {
  d3.csv(url, function(data) {
    data.forEach(function(d) { // you can use a Array.map() instead for a cleaner solution
      d.word = d.word;
      d.frequency = +d.frequency;
    })

    resolve(data);
  });
});

Promise.all([ // load both csvs, and wait for the results of both
  getCsv('data/csv1.csv'),
  getCsv('data/csv1.csv')
])
.then(([dataCSV, dataCSV]) => { 
  const collection = { dataCSV, dataCSV2 };
  console.log(collection );
});

【讨论】:

  • 嘿伙计,我只想说这很好用。但是使用promises时是否可以在全局范围内拥有collection
  • 您可以将函数内的数据分配给一个全局变量(就像您在原始代码中所做的那样),但不确定它是否会在您需要时出现。在您的原始代码中,在d3.csv(); 之后添加console.log(dataCSV1)。结果将始终为undefined。由于异步调用,调用之后的代码在结果到达之前执行,并且知道何时完成的唯一方法是使用回调、承诺、生成器或异步/等待(使用承诺)。我对你的建议是了解 javascript 的工作原理。
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
相关资源
最近更新 更多