Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这个普通js函数在d3v3和d3v4中返回不同的结果_Javascript_D3.js - Fatal编程技术网

Javascript 为什么这个普通js函数在d3v3和d3v4中返回不同的结果

Javascript 为什么这个普通js函数在d3v3和d3v4中返回不同的结果,javascript,d3.js,Javascript,D3.js,这是一个基于一些模板的MWE,这些模板从令人惊叹的d3.js的v3到v4 数据位于csv文件中,两个示例加载相同的文件(其干净): 以下是MWE的问题: d3.csv("../data/source/movies.csv", function (error, data) { dataViz(data)}); function dataViz(incData) { expData = incData; stackData =[]; for (x in incData[0]) {

这是一个基于一些模板的MWE,这些模板从令人惊叹的d3.js的v3到v4

数据位于csv文件中,两个示例加载相同的文件(其干净):

以下是MWE的问题:

d3.csv("../data/source/movies.csv", function (error, data) {
dataViz(data)});

function dataViz(incData) {
expData = incData;
stackData =[];    

for (x in incData[0]) {
    if (x != "day") {
        var newMovieObject = {
            name: x, values:[]
        };             
        for (y in incData) {
            newMovieObject
            .values
             .push({
                x: parseInt(incData[y][ "day"]), 
                y: parseInt(incData[y][x])
            })
        }
        stackData
        .push(newMovieObject);
    }}}
现在在v3中,
stackData
数组有6个对象,每个对象都有10个值,例如:

{name: "movie1" values:[
  {x: 1, y:20} //0
  ... 
  {x:10, y:0} //9
]
…

}
然而,在v4 for中,我得到了一个包含6个对象的数组,每个对象都有11个值,最后一个令人烦恼的是:

{name: "movie1" values:[
  {x: 1, y:20} //0
  ... 
  {x:10, y:0} //9
  {x: NaN, y: NaN} //10 *ouch*
]
…

}      

作为一个js noob,我不明白为什么这个普通的js函数返回不同的结果,以及如何处理它?任何帮助都将不胜感激

造成这种差异的原因是D3 v4.x在解析CSV时为
数据
数组创建了一个名为
的附加属性(请参见)

例如,根据您的数据:

day,movie1,movie2,movie3,movie4,movie5,movie6
1,20,8,3,0,0,0
2,18,5,1,13,0,0
...
D3在“普通”对象之后创建此附加对象(从技术上讲,是数组的附加属性):

您可以使用
data.columns
调用它

您现在面临的问题是,当您在循环中为…使用
时,您最终也会迭代此属性,从而得到大量NaN

解决方案:您可以简单地避免迭代
,或者,如果不需要,可以从数据中删除它。在JavaScript中,有几种方法可以从数组中删除属性,最简单的方法是:

delete incData.columns;

要检查此
columns
属性,只需使用D3 v3和v4比较结果
console.log(data)

谢谢@Gerardo按照您的建议删除列即可解决问题。如果我理解正确,我将不得不修改调用数据的每个函数,以停止对columns属性的迭代。那将是一个很大的工作。是否有放置
delete
语句的最佳实践。我现在在“datavic(incData)”签字人的顶部调用它。如果您没有使用此
,您只需在
d3.csv
函数中获取数据后执行
删除数据。列
columns: ["day", "movie", "movie2", "movie3", "movie4", "movie5", "movie6"]
delete incData.columns;