当前位置: 首页 > 知识库问答 >
问题:

在为D3.js转换数据时使用forEeach()循环的备选方案

申屠昆
2023-03-14

正如stackoverflow.com上前面的文章所指出的,我仍然在与这个错误作斗争。我已经分离出了问题的原因,这是在我的D3.js代码中,它无法通过一个“对象”进行迭代。我的原始数据源是一个RESTful web API。使用jQuery和JavaScript函数,我可以将值加载到名为'dataset'的变量中。当我输出'dataset'的内容作为警报,或者使用jQuery将其写入html元素时,所有数据都在那里。太多的D3.js示例使用硬编码的数据文件。所以很重要的一点是,当我使用相同数据的硬编码版本时,一切正常,但我只限于使用数据的这个动态虚拟变量。

当我运行代码时,它在以下函数处崩溃:

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

错误消息为未捕获的TypeError:无法读取未定义的属性“length”。

当我在这个函数前面使用console.log(typeof(dataset))时,我得到的是'object'。如果有任何D3.js导师阅读这篇文章,我有什么选择来转换这个数据?我探索了几次都没有成功。

//=============追加01========================================

这里是“dataset”,可以在前面的post链接(使用d3.js解析时间序列数据)中查看:

    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}
    ];

//==============追加02======================================

关于Gerardo的问题,'dataset'变量是'loaded'(我认为),因为代码在一个'$.get'函数中,该函数组装了'dataset'变量,如下所示:

    //~ 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
    });

//=============追加03====================================

我让它起作用了!

我会把修改后的工作代码贴在下面。但我想向关注这篇文章的人解释一下,我发现了什么。

Mark建议更改dataset.push()以删除所有引号。这给了我对象而不是字符串。经过一些故障排除,它最终显示出预期的(完全精神!),谢谢马克,你的建议起到了作用。

以下是修改后的代码:

    //~ 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;
      };

共有1个答案

有宏邈
2023-03-14

如果您不确定您将得到的是一个'array of objects'还是一个'objects with key/values',那么我将使用库中的_.foreach“lodash”将迭代对象数组或对象的key/values。

 类似资料:
  • 问题内容: 我目前正在通过切换到PDO来更新我的应用。我有以下代码: 在上面的代码之后,var $ productidLst为1,2,我想使用与此等效的PDO: 我已经尝试了多种组合,但是没有成功,因此对此提供任何帮助将不胜感激(在第二个代码块$ res中是sql)。其次,我将参数$ productidLst设置为INT是否正确或应该是字符串? --------------------更新1 --

  • 本文向大家介绍JS循环遍历JSON数据的方法,包括了JS循环遍历JSON数据的方法的使用技巧和注意事项,需要的朋友参考一下 JSON数据如:{"options":"[{/"text/":/"王家湾/",/"value/":/"9/"},{/"text/":/"李家湾/",/"valu e/":/"10/"},{/"text/":/"邵家湾/",/"value/":/"13/"}]"} 用js可以写

  • 今天,我开始使用MapSTRt为我的项目创建我的模型到DTO转换器,我想知道它是否自动处理循环引用,但事实证明它没有。 这是我用来测试它的转换器: 这就是测试: Notifica、AvvisionNotifica及其各自的模型都是带有setter和getter的简单POJO,因此我认为无需发布代码(如果您想知道,Notifica扩展了Corrispondenza) 这段代码进入了一个无限的循环,这

  • 是寻求帮助的时候了。我已经学习D3.js好几个星期了,现在才开始觉得自己理解了它的10%(哈哈哈)。我正在尝试生成一个非常简单的线图。只要数据非常简单,我就能做到这一点,但是我的原始数据源有UTC时间戳,以及实数/十进制数字,这些数字总是使任何简单之外的东西崩溃。 原始数据源如下所示: 使用jQuery和javascript时间格式化函数,我可以组装以下简化的数据集: 下面是我的代码: 第一个错误

  • 问题内容: 我正在尝试将此for循环重写为for每个循环。 这就是我尝试过的 谁能指出我正确的方向?谢谢。 问题答案: 我认为您想得太多… :)

  • 我有一个数据,显示了几个用户执行的一系列操作(列<code>actions</code>)(列<code>Id</code>)。数据帧的顺序很重要——它是执行操作的顺序。对于每个id,执行的第一个操作是<code>start</code>。可以连续执行相同的操作(例如,序列<code>start- 目标-在嵌套在多个级别上的JSON中转换这些数据,这些数据将在D3.js可视化中使用(就像这样)。我