Alternativas para usar o loop forEeach () durante a conversão de dados para D3.js

Ainda estou lutando com esse erro, conforme indicado nestepost anterior em StackOverflow.com. Eu isolei a causa do problema, que está no meu código D3.js. ele não consegue iterar através de um 'objeto'. Minha fonte de dados brutos é uma API da web RESTful. Usando jQuery e uma função JavaScript, sou capaz de carregar os valores em uma variável chamada 'conjunto de dados'. Quando eu produzo o conteúdo do 'conjunto de dados' como um alerta, ou o escrevo em um elemento html usando jQuery, todos os dados estão lá. Muitos exemplos de D3.js. usam arquivos de dados codificados. Portanto, é importante observar que quando eu uso uma versão codificada dos mesmos dados, tudo funciona, mas estou limitado a usar essa variável virtual dinâmica de dados.

Quando executo o código, ele trava nessa função:

    dataset.forEach(function(d) {
        d.theTime = parseDate(d.theTime);
        d.theValue = +d.theValue;
    });

A mensagem de erro éUncaught TypeError: Cannot read property 'length' of undefined.

Quando eu usoconsole.log(typeof(dataset)) logo antes desta função eu recebo 'objeto'. Se houver algum mentor do D3.js. lendo isso, quais são minhas opções para converter esses dados? Eu explorei vários sem sucesso.

// ============= APÊNDICE 01 ========================

Como foi solicitado aqui, está o 'conjunto de dados', que pode ser visualizado no link da postagem anterior (Analisando dados de séries temporais usando D3.js) acima:

    var dataset = [
    {'theTime': '2016/07/12 15:58:40', 'theValue': 1123.07275390625},
    {'theTime': '2016/07/12 16:21:10', 'theValue': 1055.6793212890625},
    {'theTime': '2016/07/12 16:45:40', 'theValue': 962.4850463867188},
    {'theTime': '2016/07/12 17:14:40', 'theValue': 831.2259521484375},
    {'theTime': '2016/07/12 17:55:10', 'theValue': 625.3046875}
    ];

// ============= APENDIDO 02 ==========================

Em referência à pergunta de Gerardo, a variável 'conjunto de dados' é 'carregada' (acho) devido ao código estar dentro de uma função '$ .get' que monta a variável 'conjunto de dados', como mostrado aqui:

    //~ Populate the 'dataset':
    var dataset = [];
    $.get(url, function(data){
        var itemCount = data.Items.length;
        var commaCount = itemCount - 1;
        for(i=0; i<itemCount; i++){
            if(i == commaCount){
                dataset.push("{'theTime': '" + formattedDateTime(data.Items[i].Timestamp) + "', 'theValue': " + data.Items[i].Value + "}");
            }
            else {
                dataset.push("{'theTime': '" + formattedDateTime(data.Items[i].Timestamp) + "', 'theValue': " + data.Items[i].Value + "},");
            }
        }
    //~ ALL THE D3 CODE IS INSIDE THIS '$.get' FUNCTION
    });

// ============= APENAS 03 ========================

Eu consegui!

Vou postar o código de trabalho revisado abaixo. Mas para quem segue este post, eu queria explicar o que encontrei.

Marcos sugeriu alterar odataset.push() para soltar todas as aspas. Isso me deu objetos em vez de cordas. Depois de alguma solução de problemas, ele finalmente foi exibido como esperado (totalmente empolgado!) E, graças a Mark, suas sugestões foram úteis.

Aqui está o código revisado:

    //~ Populate the 'dataset':
    var dataset = [];
    $.get(url, function(data){
        var itemCount = data.Items.length;
        var commaCount = itemCount - 1;
        for(i=0; i<itemCount; i++){
            dataset.push({theTime: formattedDateTime(data.Items[i].Timestamp), theValue: data.Items[i].Value});
        }

        var margin = {top: 20, right: 20, bottom: 30, left: 50};
        var width = 960 - margin.left - margin.right;
        var height = 500 - margin.top - margin.bottom;
        var parseDate = d3.time.format("%Y/%m/%d %H:%M:%S").parse;

        var x = d3.time.scale()
          .range([0, width]);

        var y = d3.scale.linear()
          .range([height, 0]);

        var xAxis = d3.svg.axis()
          .scale(x)
          .orient("bottom");

        var yAxis = d3.svg.axis()
          .scale(y)
          .orient("left");

        var line = d3.svg.line()
          .x(function(d) { return x(d.theTime); })
          .y(function(d) { return y(d.theValue); });


        var svg = d3.select("#myChart").append("svg")
          .attr("width", width + margin.left + margin.right)
          .attr("height", height + margin.top + margin.bottom)
        .append("g")
          .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

        dataset.forEach(function(d) {
            d.theTime = parseDate(d.theTime);
            d.theValue = parseFloat(d.theValue);
        });

         x.domain(d3.extent(dataset, function(d) { return d.theTime; }));
         y.domain(d3.extent(dataset, function(d) { return d.theValue;}));

         svg.append("g")
                 .attr("class", "x axis")
                 .attr("transform", "translate(0," + height + ")")
                 .call(xAxis);

         svg.append("g")
                 .attr("class", "y axis")
                 .call(yAxis)
                 .append("text")
                 .attr("transform", "rotate(-90)")
                 .attr("y", 6)
                 .attr("dy", ".71em")
                 .style("text-anchor", "end")
                 .text("M³/hr");

         svg.append("path")
                 .datum(dataset)
                 .attr("class", "line")
                 .attr("d", line);
    });

      //~~~ Format The Date:
      function formattedDateTime(dateAndTime) {
            var d = new Date(dateAndTime);
            var numDate = d.getDate();
            var numMonth = d.getMonth() + 1;
            var numYear = d.getFullYear();
            var numHours = d.getHours();
            var numMinutes = d.getMinutes();
            var numSeconds = d.getSeconds();
            numDate = (numDate < 10) ? "0" + numDate : numDate;
            numMonth = (numMonth < 10) ? "0" + numMonth : numMonth;
            numHours = (numHours < 10) ? "0" + numHours : numHours;
            numMinutes = (numMinutes < 10) ? "0" + numMinutes : numMinutes;
            numSeconds = (numSeconds < 10) ? "0" + numSeconds : numSeconds;

            return numYear + "/" + numMonth + "/" + numDate + " " + numHours + ":" + numMinutes + ":" + numSeconds;
      };

questionAnswers(2)

yourAnswerToTheQuestion