javascript - 将新行动态添加到具有从 csv 文件创建的标题的数组中

标签 javascript arrays csv d3.js

我正在尝试动态(on_click 事件)将新行添加到使用 d3 从 CSV 文件加载的数组中。第一行已被识别为标题。

但是,新的行数据没有正确更新数组?

Date,Mcode,Weight,Reps,Points
2017/06/01,HIPABD,160.0,25,66
2017/06/02,STRETCH,,10,10
2017/06/03,TWISTS,25.0,50,20
2017/06/04,SBENDS,25.0,50,20

以下是相关代码片段。使用行转换器格式化日期和数字列。

我使用 on_click 事件添加新行。

//Function for converting CSV values from strings to Dates and numbers
        var rowConverter = function(d) {
            return {
                Date:    parseTime(d.Date),
                Mcode:             d.Mcode,              // No Conversion
                Weight:            parseFloat(d.Weight), // convert to floating point
                Reps:              parseFloat(d.Reps),   // convert to floating point
                Points:            parseFloat(d.Points)  // convert to floating point
                    };
                                       }

            // load dataset from csv file
            d3.csv("small_points_data.csv", rowConverter, function(error, csvdata) {
                if (error) {console.log(error);} // error detected, no data loaded
                 else {console.log(csvdata);}   // no error detected, data loaded
                       dataset = csvdata;       // once loaded, copy data to dataset variable


                //On click, update with new data
                d3.select("p")
                    .on("click", function() {

                        //Add one new value to dataset
                        dataset.push([2017/07/22,"SHLPRESS",55.0,10,78]);

以下是检查数组的结构和内容时控制台的输出。

第一个是从 CSV 文件加载的原始数组;这可以。 展开的是最后一行 (3) 和标题数组

第二个是执行 on_click 添加新行后的数组。展开的是原来的最后一行 (3)、新的最后一行 (4) 和标题数组。

dataset
(4) [{…}, {…}, {…}, {…}, columns: Array(5)]
0: {Date: Thu Jun 01 2017 00:00:00 GMT-0500 (Central Daylight Time), Mcode: "HIPABD", Weight: 160, Reps: 25, Points: 66}
1: {Date: Fri Jun 02 2017 00:00:00 GMT-0500 (Central Daylight Time), Mcode: "STRETCH", Weight: NaN, Reps: 10, Points: 10}
2: {Date: Sat Jun 03 2017 00:00:00 GMT-0500 (Central Daylight Time), Mcode: "TWISTS", Weight: 25, Reps: 50, Points: 20}

3:
Date: Sun Jun 04 2017 00:00:00 GMT-0500 (Central Daylight Time) {}
Mcode: "SBENDS"
Points: 20
Reps: 50
Weight: 25
__proto__: Object

columns: Array(5)
0: "Date"
1: "Mcode"
2: "Weight"
3: "Reps"
4: "Points"
length: 5
__proto__: Array(0)
length: 4
__proto__: Array(0)



*** after new row added ****

dataset
(5) [{…}, {…}, {…}, {…}, Array(5), columns: Array(5)]
0: {Date: Thu Jun 01 2017 00:00:00 GMT-0500 (Central Daylight Time), Mcode: "HIPABD", Weight: 160, Reps: 25, Points: 66}
1: {Date: Fri Jun 02 2017 00:00:00 GMT-0500 (Central Daylight Time), Mcode: "STRETCH", Weight: NaN, Reps: 10, Points: 10}
2: {Date: Sat Jun 03 2017 00:00:00 GMT-0500 (Central Daylight Time), Mcode: "TWISTS", Weight: 25, Reps: 50, Points: 20}

3:
Date: Sun Jun 04 2017 00:00:00 GMT-0500 (Central Daylight Time) {}
Mcode: "SBENDS"
Points: 20
Reps: 50
Weight: 25
__proto__: Object

4: Array(5)
0: 13.0974025974026
1: "SHLPRESS"
2: 55
3: 10
4: 78
length: 5
__proto__: Array(0)

columns: Array(5)
0: "Date"
1: "Mcode"
2: "Weight"
3: "Reps"
4: "Points"
length: 5
__proto__: Array(0)



**** this is the new row with nothing expanded ****

(5) [{…}, {…}, {…}, {…}, Array(5), columns: Array(5)]
0: {Date: Thu Jun 01 2017, Mcode: "HIPABD", Weight: 160, Reps: 25, Points: 66}
1: {Date: Fri Jun 02 2017 00:00:00 GMT-0500 (Central Daylight Time), Mcode: "STRETCH", Weight: NaN, Reps: 10, Points: 10}
2: {Date: Sat Jun 03 2017 00:00:00 GMT-0500 (Central Daylight Time), Mcode: "TWISTS", Weight: 25, Reps: 50, Points: 20}
3: {Date: Sun Jun 04 2017 00:00:00 GMT-0500 (Central Daylight Time), Mcode: "SBENDS", Weight: 25, Reps: 50, Points: 20}
4: (5) [13.0974025974026, "SHLPRESS", 55, 10, 78]
columns: (5) ["Date", "Mcode", "Weight", "Reps", "Points"]
length: 5
__proto__: Array(0)



新行 (4) 似乎存在许多问题:

1) 为什么它显示为 Array(5),而第 (3) 行却没有显示?

2) 新行(4) 的值不会像行(3) 一样显示列名称。

3) 日期(第一列)未转换为日期格式,而是被视为方程。

问题:

我需要对代码进行哪些更改才能使动态添加的新行看起来和工作方式与从 CSV 文件加载的原始行类似?

数据集的最后一个控制台 View (未进行任何扩展)可以轻松查看从 CSV 文件加载的原始三行与动态添加的第四行之间的差异。

感谢您的帮助和建议。

最佳答案

一旦d3.csv完成对 CSV 的解析,并且您在回调中,就不再有:忘记您拥有 CSV 结构,现在您只有一个 JavaScript 对象数组。

因此,解决方案是将新行作为对象推送,并带有相应的键。

例如,这是一个使用 d3.csvParse 的示例,因为我无法在 Stack Overflow 代码段中使用 d3.csv:

var csv = `Date,Mcode,Weight,Reps,Points
2017/06/01,HIPABD,160.0,25,66
2017/06/02,STRETCH,,10,10
2017/06/03,TWISTS,25.0,50,20
2017/06/04,SBENDS,25.0,50,20`;

var parseTime = d3.timeParse("%Y/%m/%d")

var rowConverter = function(d) {
  return {
    Date: parseTime(d.Date),
    Mcode: d.Mcode,
    Weight: parseFloat(d.Weight),
    Reps: parseFloat(d.Reps),
    Points: parseFloat(d.Points)
  };
}

var data = d3.csvParse(csv, rowConverter);

d3.select("p")
  .on("click", function() {
    data.push({
      Date: parseTime("2017/07/22"),
      Mcode: "SHLPRESS",
      Weight: 55.0,
      Reps: 10,
      Points: 78
    });
    console.log(data)
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<p>Click me</p>

关于javascript - 将新行动态添加到具有从 csv 文件创建的标题的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59227481/

相关文章:

javascript - 使用 AJAX 和 Jquery 从服务器请求数据

javascript - 类型错误 : Cannot read property '0' of undefined inside v-for

javascript - 获取下一个标签 - jquery

php - 不返回填充数组的计数

python - 向 dictReader 添加列而不修改 CSV 文件

python - 减去 TimeDate 列

javascript - 如何处理带有 html5 输入类型数字的 float 和小数点分隔符

c++ - 错误 C2075 : array initialization needs curly braces

java - 根据计算值对数组进行排序

c++ - 如何在 C++ 中获取 .csv 文件的一部分?