Javascript d3.max()不返回数组中的最大值?

Javascript d3.max()不返回数组中的最大值?,javascript,d3.js,Javascript,D3.js,我整晚都在自学d3,似乎无法解决这个问题。我正在通过HTML元素动态地向d3.max()方法提供一个数字数组(我已经尝试过用parseInt()/parseFloat()解析它们,也尝试过不解析它们)。我正在使用控制台来检查这些值,因为我的可视化正在变得扭曲。然而,有时它确实返回最大值,有时它只是不返回 var localityElectricityConsumption = localities[localityName].totalElectricityConsumption;

我整晚都在自学d3,似乎无法解决这个问题。我正在通过HTML
元素动态地向
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”,行转换器,函数(数据){//…})