我的代码中有这个:
_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
};
})
答案 0 :(得分:3)
标准答案是否。由于您的map
函数d
是一个对象,就像这样......
{Company: "foo", Continent: "bar", Dt: "baz", NumUsers: "foobar"}
...而不一个数组,不可能分辨谁是第一个,谁是最后一个:你无法保证对象中属性的顺序。
但是,使用D3 v4,有一种方法可以按位置识别列... 如果您正在使用d3.csv
或d3.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>