2015-11-08 2 views
0

Я пытаюсь решить эту проблему, так как 2 дня сейчас не уверены, как это решить. Я получаю эту ошибку белый пытается добавить данные в визуализацииd3.js проблемы с чтением dataset

Uncaught TypeError: Не удается прочитать свойство «длина» неопределенной

Это, кажется, связано с набором данных. Но независимо от того, что я делаю, я получаю эту ошибку, если набор данных console.log вне функции checkit (см. Ниже) возвращает неопределенные.

данных

[ { 
    "Continent":"Asia.Oceania", 
    "Country_Names":"Viet Nam", 
    "Total":142.9 
    }, 
    { 
    "Continent":"Asia.Oceania", 
    "Country_Names":"Yemen", 
    "Total":20 
    }, 
    { 
    "Continent":"Misc", 
    "Country_Names":"World marine bunkers", 
    "Total":602.2 
    }, 
    { 
    "Continent":"Misc", 
    "Country_Names":"World aviation bunkers", 
    "Total":477.8 
    } 
] 

код

var svg_0 = d3.xml("drawing.svg", "image/svg+xml", function(xml) { 
    var importedNode = document.importNode(xml.documentElement, true); 
    d3.select("#viz").node().appendChild(importedNode); 



var dataset; 

function checkIt(data){ 
for (var i in data) { 
      var data_clean; 
      data_clean = data[i].Total 
      dataset = data_clean 
      console.log(dataset) //returns data 
     } 

     } 
    console.log(dataset)//returns undefined 


    d3.json("data.json", checkIt); 


    var svg = d3.select("#level_0") 
       .selectAll("path") 
       .data(dataset) 
       .enter() 
    }); 

ответ

2

d3.json("data.json", checkIt); является асинхронной операцией (check syntax here for example). Короче говоря, это означает, что в какой-то момент выполнения вашего кода dataset переменная буквально еще не определена. Затем, позже это определено, но уже слишком поздно.

Это означает, что вам нужно быть уверенным, что набор данных определяется при его использовании. Например, вы можете переместить использование для проверки обратного вызова так:

var dataset; 
    function checkIt(data){ 
    var data_clean = []; //prepared variable for clear data 
    for (var i in data) { 
     data_clean.push(data[i].Total); 
     } 
    //move initialisation here, to be sure dataset is there 
    var svg = d3.select("#level_0") 
       .selectAll("path") 
       .data(data_clean); 
    } 
//other code here... 
d3.json("data.json", checkIt); 
//other code here... 
+0

после перемещения d3.json ("data.json", checkIt); в последней позиции в коде я все еще получаю эту ошибку. Я думаю, это потому, что набор данных var не может получить данные вне функции checkit, не уверен, как это сделать, хотя – Imo

+0

Попробуйте поместить 'var svg = ....' Все, что блокируется функцией 'checkIt'. Вот что является основным предложением. – shershen

+0

после этого я получаю эту ошибку Непринятый TypeError: d3.select (...). SelectAll (...). Data (...). Enter (...). Attr не является функцией – Imo

Смежные вопросы