0

我正在从数据库中按日期降序获取一些数据,并使用 shift-push 通过循环将其添加到数组中,因为新数据会定期到达。

我无法理解的一件奇怪的事情是为什么将第一个获取的值添加到最后一个索引中。

这是我的代码:

function dspChrt3(Device_Data) { 
        //console.log(Device_Data);

        var time_Array = [];
        var meas_value_Array = [];

       for(var i=0; i<Device_Data.length; i++) {
            time_Array.push(Device_Data[i].date_time);
            meas_value_Array.push(Device_Data[i].meas_value);
            }

        //console.log(Device_Data[0].date_time);
        //console.log(Device_Data[1].meas_value);
        date_time = Device_Data[0].date_time;
        meas_value = Device_Data[1].meas_value;
        time_Array.shift();
        time_Array.push(date_time);
        meas_value_Array.shift();
        meas_value_Array.push(meas_value);

        console.log(time_Array);
     }

这是 console.log(time_Array); 输出

(12) […]
​0: "2018-12-10 11:45:16"
​1: "2018-12-10 11:30:16"
​2: "2018-12-10 11:15:16"
​3: "2018-12-10 11:00:16"
​4: "2018-12-10 10:45:16"
​5: "2018-12-10 10:30:16"
​6: "2018-12-10 10:15:16"
​7: "2018-12-10 10:00:16"
​8: "2018-12-10 09:45:16"
​9: "2018-12-10 09:30:16"
​10: "2018-12-10 09:15:16"
​11: "2018-12-10 12:00:19"
​length: 12 

// 循环应该从 12:00 开始,但它的最后一个值。

这是php:

<?php
    require("Connection.php");
    $stmt = $conn->prepare("Select date_time FROM soil_measurements order by date_time desc limit 12");
    $stmt->execute();

    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $WData = $stmt->fetchAll();
    ?>
    <script>
      var WData = <?php echo(json_encode($WData));?>;
      //console.log(WData);
      //console.dir(WData);
    window.onload(dspChrt3(WData));
    </script>    
 </body>
</html>

编辑

var_dump()

数组(12){[0]=>数组(2){[“date_time”]=>字符串(19)“2018-12-10 12:15:16”[“meas_value”]=>int(106)} [1]=> array(2) { ["date_time"]=> string(19) "2018-12-10 12:00:19" ["meas_value"]=> int(106) } [2]=> array(2) { ["date_time"]=> string(19) "2018-12-10 11:45:16" ["meas_value"]=> int(106) } [3]=> array(2) { ["date_time"]=> string(19) "2018-12-10 11:30:16" ["meas_value"]=> int(106) } [4]=> array(2) { ["date_time"] => 字符串(19) "2018-12-10 11:15:16" ["meas_value"]=> int(106) } [5]=> 数组(2) { ["date_time"]=> 字符串(19 ) "2018-12-10 11:00:16" ["meas_value"]=> int(106) } [6]=> array(2) { ["date_time"]=>string(19) "2018-12-10 10:45:16" ["meas_value"]=> int(106) } [7]=> array(2) { ["date_time"]=> string(19) " 2018-12-10 10:30:16" ["meas_value"]=> int(107) } [8]=> array(2) { ["date_time"]=> string(19) "2018-12-10 10:15:16" ["meas_value"]=> int(107) } [9]=> array(2) { ["date_time"]=> string(19) "2018-12-10 10:00:16 " ["meas_value"]=> int(107) } [10]=> array(2) { ["date_time"]=> string(19) "2018-12-10 09:45:16" ["meas_value" ]=> int(107) } [11]=> array(2) { ["date_time"]=> string(19) "2018-12-10 09:30:16" ["meas_value"]=> int( 107) }array(2) { ["date_time"]=> string(19) "2018-12-10 10:30:16" ["meas_value"]=> int(107) } [8]=> array(2) { ["date_time"]=> string(19) "2018-12-10 10:15:16" ["meas_value"]=> int(107) } [9]=> array(2) { ["date_time"] => 字符串(19) "2018-12-10 10:00:16" ["meas_value"]=> int(107) } [10]=> array(2) { ["date_time"]=> 字符串(19 ) "2018-12-10 09:45:16" ["meas_value"]=> int(107) } [11]=> array(2) { ["date_time"]=> string(19) "2018-12 -10 09:30:16" ["meas_value"]=> int(107) }array(2) { ["date_time"]=> string(19) "2018-12-10 10:30:16" ["meas_value"]=> int(107) } [8]=> array(2) { ["date_time"]=> string(19) "2018-12-10 10:15:16" ["meas_value"]=> int(107) } [9]=> array(2) { ["date_time"] => 字符串(19) "2018-12-10 10:00:16" ["meas_value"]=> int(107) } [10]=> array(2) { ["date_time"]=> 字符串(19 ) "2018-12-10 09:45:16" ["meas_value"]=> int(107) } [11]=> array(2) { ["date_time"]=> string(19) "2018-12 -10 09:30:16" ["meas_value"]=> int(107) }["meas_value"]=> int(107) } [9]=> array(2) { ["date_time"]=> string(19) "2018-12-10 10:00:16" ["meas_value"] => int(107) } [10]=> array(2) { ["date_time"]=> string(19) "2018-12-10 09:45:16" ["meas_value"]=> int(107 ) } [11]=> array(2) { ["date_time"]=> string(19) "2018-12-10 09:30:16" ["meas_value"]=> int(107) }["meas_value"]=> int(107) } [9]=> array(2) { ["date_time"]=> string(19) "2018-12-10 10:00:16" ["meas_value"] => int(107) } [10]=> array(2) { ["date_time"]=> string(19) "2018-12-10 09:45:16" ["meas_value"]=> int(107 ) } [11]=> array(2) { ["date_time"]=> string(19) "2018-12-10 09:30:16" ["meas_value"]=> int(107) }测量值"]=> int(107) }测量值"]=> int(107) }

4

2 回答 2

1

.push()总是将新项目添加到数组的末尾。

尝试使用.unshift()将项目添加到数组的开头。

于 2018-12-10T11:18:44.997 回答
1

循环工作正常,它后面的代码是破坏事物的代码:

date_time = Device_Data[0].date_time;
meas_value = Device_Data[1].meas_value;
time_Array.shift();
time_Array.push(date_time);
meas_value_Array.shift();
meas_value_Array.push(meas_value);

第一行提取date_time已经存储在循环中的time_Array[0]for
第 3( time_Array.shift();) 删除 的第一个元素time_Array并将所有其他元素移向其开头一个位置。
第 4( time_Array.push(date_time);) 将第一行存储的值date_time放入time_Array. 请记住,它与上一步从数组中删除的值相同( 的前一个值time_Array[0])。

其他三行更奇怪。他们做类似的事情meas_value_Array(删除它的第一个值,在其末尾添加另一个值),但他们使用已经存储在meas_value_Array[1]. 最后,meas_value_Array丢失从数据库接收到的第一个值,并包含在其两端重复的第二个值。

这6行的目的是什么?它们没有任何意义,并且与您在问题中描述的预期结果不符。


更新(在评论中与 OP 讨论后我认为我理解的内容)

该声明

window.onload(dspChrt3(WData));

是一种一次性初始化,将值从数组中WData复制出来time_Arraymeas_value_Array

为此,函数中的for循环dspChrt3()就足够了,之后不需要其他任何东西:

function dspChrt3(Device_Data) { 
    // Declaring this variables using `var` makes them local to this function
    // and not visible outside it. I removed the `var` keyword from here
    time_Array = [];
    meas_value_Array = [];

    for (var i = 0; i < Device_Data.length; i ++) {
        time_Array.push(Device_Data[i].date_time);
        meas_value_Array.push(Device_Data[i].meas_value);
    }
}

接下来,如果在页面加载后以某种方式从服务器检索到新数据,则可以使用此函数将新数据放在现有数据的前面并删除旧条目:

function updateChrt3(newData) {
    for (var i = newData.length - 1; i >= 0; i --) {
        // remove the last element of time_Array
        time_Array.pop();
        // insert a new element in front of time_Array
        time_Array.unshift(newData[i].date_time);

        meas_value_Array.pop();
        meas_value_Array.unshift(newData[i].meas_value);
    }
}

(有更快的方法来实现相同的目的,但它们不是这个问题的主题)

于 2018-12-10T11:38:22.837 回答