Javascript d3.max()不返回数组中的最大值?
我整晚都在自学d3,似乎无法解决这个问题。我正在通过HTMLJavascript d3.max()不返回数组中的最大值?,javascript,d3.js,Javascript,D3.js,我整晚都在自学d3,似乎无法解决这个问题。我正在通过HTML元素动态地向d3.max()方法提供一个数字数组(我已经尝试过用parseInt()/parseFloat()解析它们,也尝试过不解析它们)。我正在使用控制台来检查这些值,因为我的可视化正在变得扭曲。然而,有时它确实返回最大值,有时它只是不返回 var localityElectricityConsumption = localities[localityName].totalElectricityConsumption;
元素动态地向d3.max()
方法提供一个数字数组(我已经尝试过用parseInt()
/parseFloat()
解析它们,也尝试过不解析它们)。我正在使用控制台来检查这些值,因为我的可视化正在变得扭曲。然而,有时它确实返回最大值,有时它只是不返回
var localityElectricityConsumption = localities[localityName].totalElectricityConsumption;
maxConsumption = d3.max(localityElectricityConsumption);
r = d3.scale.linear().domain([0, maxConsumption]).range([120, 0]);
console.log("array being fed to d3.max: " + localityElectricityConsumption);
console.log("what d3.max() is returning: " + d3.max(localityElectricityConsumption));
console.log("what parseInt(d3.max()) is returning: " + d3.max(localityElectricityConsumption));
您可以查看实时可视化并查看控制台。尝试使用最上面的图形从北美地区切换到墨西哥地区d3.max()
返回北美的最大值,但不返回墨西哥,因此无法正确绘制墨西哥的数据。我被正式难倒了。任何帮助都将不胜感激
编辑:
以下是用于创建地区[localityName]的代码。totalElectricityConsumption
:
d3.csv("data/" + dataset, function (data) {
for (var i = 0; i < data.length; i++) {
var record = data[i];
if (dataset === "total_electricity_consumption.csv") {
currentDataset = listOfDatasets[0].name;
record.totalElectricityConsumption = [];
// loop through all years, from 1980 to 2012
for (var year = 1980; year <= 2012; year++) {
var value = record[year];
// deal with missing data points
if (value === '--') {
value = 0;
}
else if (value === 'NA') {
value = 0;
}
else if (value === '(s)') {
value = 0;
}
else if (value === 'W') {
value = 0;
}
// add record of current total electricity consumption
record.totalElectricityConsumption.push(value);
}
}
// create a list of country names
localities[record.Locality] = record;
listOfLocalities.push(record.Locality);
}
}
d3.csv(“数据/”+数据集、函数(数据){
对于(变量i=0;id3.max()
确实返回了最大值……但是,它返回的是字符串中的最大值,而不是数字中的最大值
解释是,默认情况下,d3.csv()
将以字符串形式加载所有值,即使它们是数字。因此,当您这样做时:
var value = record[year];
value
是字符串,而不是数字。在JavaScript中,字符串数组的最大值与数字数组的最大值不同。例如,使用数字:
var myArray=[1,65,9,32,42];
console.log(d3.max(myArray));
共享创建位置[localityName]的代码.totalElectricityConsumption
。顺便说一句,这里有一个提示:它返回的是最大值,但不是您期望的值。@GerardoFurtado编辑已完成!@GerardoFurtado我不确定我是否完全理解您的提示…它返回的是某些数据集的预期最大值,但不是所有数据集的最大值。请澄清一下,它返回的是所有数据集的最大值。但它是最大字符串。刚刚尝试使用parseInt
、parseFloat
和number()将我的值
变量转换为数字
并使用控制台确认它们是数字。但是,在我将其放入记录后,我没有注意到任何更改。在这种情况下,您会遇到另一个问题。d3.max()的问题
就是我刚才解释的。是的,你说的绝对有道理。我从一开始就知道这是解析的问题。我想我实际上刚刚找到了解决方案。在运行d3.max()之前,我创建一个新数组,然后使用循环遍历原始数组的每个值并重新分析这些值。之后,我将每个值推送到新数组中。然后通过d3.max()运行该数组我终于得到了正确的值。不过,我觉得我不应该这样做。@Lefty当你用一个知道如何转换每一行(按名称)的函数解析CSV时,你可以转换这些值。var rowConverter=function(d){return{Amount:parseFloat(d),Date:someDateParser(d)};};d3.CSV(“/path/file.CSV”,行转换器,函数(数据){//…})
。