2017-04-03 59 views
1

我试图用d3加载一个csv文件,并试图为显式二维数组(名为iris_2)创建一个嵌入式替换。当使用underscore.js(使用_.isEqual)比较两个二维数组时,我注意到它们不相等(check out the Codepen.io code)。更奇怪的是,如果我使用_.isEqual在检查html页面时比较它们,它说它们是平等的。阵列不等于

这里的D3代码:

var iris = []; 
d3.csv("data/iris.csv", function(mydata) { 
    mydata.forEach(function(d) { 
     d["sepal_length"] = +d["sepal_length"]; 
     d["sepal_width"] = +d["sepal_width"]; 
     d["petal_length"] = +d["petal_length"]; 
     d["petal_width"] = +d["petal_width"]; 
     iris.push([d["sepal_length"], d["sepal_width"], d["petal_length"], d["petal_width"], d["species"]]); 
    }); 
}); 

下面是其标题iris.csv文件的前五个数据线,我想与D3阅读:

sepal_length,sepal_width,petal_length,petal_width,species 
5.1,3.5,1.4,0.2,setosa 
4.9,3,1.4,0.2,setosa 
4.7,3.2,1.3,0.2,setosa 
4.6,3.1,1.5,0.2,setosa 
5,3.6,1.4,0.2,setosa 
... 

这里的第一个五年“显式”2D阵列的行:

var iris_2 = [ 
    [5.1, 3.5, 1.4, 0.2, 'setosa'], 
    [4.9, 3.0, 1.4, 0.2, 'setosa'], 
    [4.7, 3.2, 1.3, 0.2, 'setosa'], 
    [4.6, 3.1, 1.5, 0.2, 'setosa'], 
    [5.0, 3.6, 1.4, 0.2, 'setosa'] ... 

这是我使用com的underscore.js代码削两个数组:

_.isEqual(iris, iris_2); 

这将返回的HTML代码错误(见上Codepen链接),但对于Chrome的HTML检查控制台如此。

+0

而不是使用'+ d的[...]'尝试使用'1 * d [...]'。这可能有助于消除将数据解释为字符串的可能性。 – Manngo

+0

@Manngo - OP代码中的'+'(一元加号)已经转换为数字。 – nnnnnn

+0

@nnnnnn你说得对。 – Manngo

回答

2

d3.csv异步。这意味着,你的时间去...

document.getElementById("myValue").innerHTML = _.isEqual(iris, iris_2); 

...还有没有iris阵列(或者,更准确地说,它仍然是空的),结果是false

但是,如果你比较阵列回调,让时间来d3.csv填充你的iris阵列...

d3.csv("iris.csv", function(mydata) { 
    mydata.forEach(function(d) { 
     d["sepal_length"] = +d["sepal_length"]; 
     d["sepal_width"] = +d["sepal_width"]; 
     d["petal_length"] = +d["petal_length"]; 
     d["petal_width"] = +d["petal_width"]; 
     iris.push([d["sepal_length"], 
      d["sepal_width"], 
      d["petal_length"], 
      d["petal_width"], 
      d["species"] 
     ]); 
    }); 

    var iris_2 = [ 
     [5.1, 3.5, 1.4, 0.2, 'setosa'], 
     ... 
    ]; 

    document.getElementById("myValue").innerHTML = _.isEqual(iris, iris_2); 
    //comparing inside the callback 

});//callback ends here 

...你会看到的结果是true

实际上,“给时间” d3.csv填充iris阵列是如何解释你在说什么:

什么是更奇怪的是,如果我使用_.isEqual对它们进行比较检查HTML页面时,它说他们是平等的。

发生这种情况的原因是,当您检查页面时,iris数组已被创建。

您可以检查这里的工作代码:https://plnkr.co/edit/24CypznlScazjcqGKsCq?p=preview