Javascript 为什么这个普通js函数在d3v3和d3v4中返回不同的结果
这是一个基于一些模板的MWE,这些模板从令人惊叹的d3.js的v3到v4 数据位于csv文件中,两个示例加载相同的文件(其干净): 以下是MWE的问题: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]) {
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;