按位置而不是名称标识列

时间:2017-03-13 13:38:46

标签: javascript d3.js

我的代码中有这个:

 _currentData = dta.map(function(d) {
         return {
             "Filter_1": d.Company, 
             "Filter_2": d.Continent,
             "Dt": parseDate(d.Dt),
             "amount": +d.NumUsers 
         };
     })

所以dta是一个包含4列的数据表 - 它们的标题是Company/Continent/Dt/NumUsers

是否可以按位置而不是标题来标识列。我尝试了以下但不起作用:

 _currentData = dta.map(function(d) {
         return {
             "Filter_1": d[0], 
             "Filter_2": d.Continent,
             "Dt": parseDate(d.Dt),
             "amount": +d.NumUsers 
         };
     })

 _currentData = dta.map(function(d) {
         return {
             "Filter_1": d.columns(0), 
             "Filter_2": d.Continent,
             "Dt": parseDate(d.Dt),
             "amount": +d.NumUsers 
         };
     })

1 个答案:

答案 0 :(得分:3)

标准答案是。由于您的map函数d是一个对象,就像这样......

{Company: "foo", Continent: "bar", Dt: "baz", NumUsers: "foobar"}

...而一个数组,不可能分辨谁是第一个,谁是最后一个:你无法保证对象中属性的顺序。

但是,使用D3 v4,有一种方法可以按位置识别列... 如果您正在使用d3.csvd3.tsv来加载数据:

这两个函数都创建一个名为columns数组属性,其中第一行数据(标题)为数组。所以,你只需要:

var columns = data.columns;

对于您的数据,将是:

["Company", "Continent", "Dt", "NumUsers"]

之后,在columns函数中使用map数组:

var _currentData = data.map(d => {
    return {
        "Filter_1": d[columns[0]],
        "Filter_2": d[columns[1]],
        "Dt": d[columns[2]],
        "amount": d[columns[3]]
    };
});

这是一个演示:

var data = d3.csvParse(d3.select("#csv").text());

var columns = data.columns;

var _currentData = data.map(d => {
  return {
    "Filter_1": d[columns[0]],
    "Filter_2": d[columns[1]],
    "Dt": d[columns[2]],
    "amount": d[columns[3]]
  };
});

console.log(_currentData);
pre{
  display: none;
  }
<script src="https://d3js.org/d3.v4.min.js"></script>
<pre id="csv">Company,Continent,Dt,NumUsers
foo,bar,baz,foobar
foo2,bar2,baz2,foobar2
foo3,bar3,baz3,foobar3
foo4,bar4,baz4,foobar4
</pre>