我有一个简单的JavaScript语法问题.
我在下面有此链接,它有一个使用d3.js渲染条形图的代码段.
https://plnkr.co/edit/HQz1BL9SECFIsQ5bG8qb?p=preview
我不明白的是
从script.js文件中,有一条语句,
data.forEach(function(d) {
d.date = parseDate(d.date);
d.value = +d.value;
});
如果您只删除像这样的加号d.value,
data.forEach(function(d) {
d.date = parseDate(d.date);
d.value = d.value;
});
如您所见,y轴上的刻度值发生了变化..但据我所知,在值之前添加意味着将任何值转换为数字类型.
并且,如果您查看bar-data.csv文件中的数据,则所有值均包含数字,因此我认为无论是否删除该值,都没有任何改变.
解决方法:
“ …如果您查看bar-data.csv文件中的数据,则所有值均包含数字” …不,实际上,加载/解析文件后,它们不是数字:它们是字符串.
发生的是使用dsv.parse的d3.csv将所有字段加载为字符串.您可以在API中看到:
If a row conversion function is not specified, field values are strings. For safety, there is no automatic conversion to numbers, dates, or other types. (emphasis mine)
我们可以很容易地证明这一点.假设我们有这个CSV,以数字作为值:
foo,bar
17,34
42,12
由于堆栈代码段不允许我们保存CSV文件,因此我将在此处使用d3.csvParse而不是d3.csv,但结果是相同的.看一下控制台:
var csv = `foo,bar
17,34
42,12`;
var data = d3.csvParse(csv);
data.forEach(function(d) {
for (key in d) {
console.log(d[key] + ": " + typeof d[key])
}
})
<script src="https://d3js.org/d3.v5.min.js"></script>
现在,让我们使用一元加号仅转换foo列中的值:
var csv = `foo,bar
17,34
42,12`;
var data = d3.csvParse(csv, row);
data.forEach(function(d) {
for (key in d) {
console.log(d[key] + ": " + typeof d[key])
}
})
function row(d) {
d.foo = +d.foo;
return d;
}
<script src="https://d3js.org/d3.v5.min.js"></script>
PS:只是为了解释如果删除一元加号,插拔器的行为:CSV中的较高数字是478,用于轴的域.但是,除去一元加号后,较高的值将变为“ 53”,它作为字符串大于“ 478”:
console.log("53" > "478")