【问题标题】:An alternative for d3v4 "columns" (I have to use d3v3)d3v4“列”的替代方案(我必须使用 d3v3)
【发布时间】:2017-12-14 16:05:37
【问题描述】:

我需要实现以下代码:

d3.csv("data.csv", function(d, i, columns) {
  for (i = 1, t = 0; i < columns.length; ++i) t += d[columns[i]] = +d[columns[i]];
  d.total = t;
  return d;
}, function(error, data) {
  if (error) throw error;
  var keys = data.columns.slice(1);
  ...

发件人:https://bl.ocks.org/mbostock/3886208

但是,我必须使用 d3.js 版本 3。我在 d3 v4 API 参考中找到了“列”:

返回的数组还公开了一个 columns 属性,其中包含按输入顺序排列的列名(与 Object.keys 不同,它的迭代顺序是任意的)。

例如:data.columns; // [“年份”、“品牌”、“型号”、“长度”]

但我正在努力在版本 3 中想出类似的东西来用于 keys 变量,如引用代码的最后一行所示:

var keys = data.columns.slice(1);

如何使用data 获得相同的dkeys 而没有“columns”属性?

【问题讨论】:

标签: javascript csv d3.js


【解决方案1】:

尽管现在您知道v3 version of that bl.ocks,但值得一提的是,创建自己的columns 属性非常容易,但有一些缺点。

V4 中创建columns 属性的source code 是这样的:

function inferColumns(rows) {
  var columnSet = Object.create(null),
      columns = [];

  rows.forEach(function(row) {
    for (var column in row) {
      if (!(column in columnSet)) {
        columns.push(columnSet[column] = column);
      }
    }
  });
  return columns;
}

我们可以制作一个(非常)简化的版本。

这是一个普通的d3.csv D3 v3 代码,我正在加载我在网上找到的一些 CSV:

d3.csv("https://www.ibm.com/support/knowledgecenter/SVU13_7.2.1/com.ibm.ismsaas.doc/reference/AssetsImportMinimumSample.csv?view=kc", function(data) {
  console.log(data)
})
&lt;script src="https://d3js.org/d3.v3.min.js"&gt;&lt;/script&gt;

我们可以创建 columns 来获取该 CSV 的标题:

data.columns = d3.keys(data[0])

这是演示(查看您的浏览器控制台,而不是 sn-p 的控制台):

d3.csv("https://www.ibm.com/support/knowledgecenter/SVU13_7.2.1/com.ibm.ismsaas.doc/reference/AssetsImportMinimumSample.csv?view=kc", function(data){
	data.columns = d3.keys(data[0])
  console.log(data)
})
&lt;script src="https://d3js.org/d3.v3.min.js"&gt;&lt;/script&gt;

但这些是缺点:首先,此代码过于简单:例如,它没有考虑重复值。其次,它加载/解析文件后创建了columns 属性。因此,您不能在行访问器函数中使用columns,因为此时它不存在。当然,您可以在 row 函数中创建 columns 属性,但这不是一个非常明智的解决方案,因为 CSV 中的 每一 行都会调用 row 函数,这可能是数百甚至数千.

【讨论】:

  • 不维护对象属性顺序的 JS 引擎如何维护顺序?
  • @thephpdev 没有维护。
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
相关资源
最近更新 更多