正确使用split()从包含ajax的字符串创建包含日期的js 2-d数组?

时间:2018-03-18 14:57:10

标签: javascript ajax

我正在尝试使用ajax提供实时更新的图表,以提供数据和Google Charts。数据是一列,其中一列是日期格式。我试着阅读JSON.parse,但注意到日期对象没有被解析,因为我完全控制了ajax输出,为什么不发送一个字符串然后拆分并在接收端创建一个数组呢?这是我认为可行的:

文件“ajaxdemo.php”通过ajax提供数据。行由“/”任意分隔,列由“:”

任意分隔
<?php 
echo "
2018,2,14:1/
2018,2,15:2/
2018,2,16:3";
exit;
?>

文件请求数据并为图表创建数组。使用split()两次来提取二维表数组的元素。

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
</head>
<body>
<script>

jQuery(function($){
  $(document).ready(function(){
  google.charts.load('current', {packages: ['corechart', 'line']});

 var indata = [];

 $.get("ajaxdemo.php",
   {},
   function(data,status){
      var datarray = data.split("/");//make each row an element in an array
      var dl = datarray.length;
      for(i=0;i<dl;i++){
        var subarray = datarray[i].split(":");//split each row into columns
        subarray[0] = new Date(subarray[0]);
       indata.push(subarray);
      }

     ;
   });

   google.charts.setOnLoadCallback(drawDemo);

   function drawDemo() {
      var data = new google.visualization.DataTable();
      data.addColumn('date', 'X');
      data.addColumn('number', 'Y');
      alert(indata[0][0]);
      data.addRows(indata);
      var options = {
        hAxis: {
          title: 'x'
        },
        vAxis: {
          title: 'y'
        },
        backgroundColor: '#FFE4DD'
      };

      var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
      chart.draw(data, options);
    }
 });
});
 </script>
 <div id="chart_div"></div>

 </body>
 </html>

结果数组indata似乎在每个方向都表现为js数组。我可以检查日期对象是否已创建好,因为它们会显示日期,例如放入警告框alert(indata[0][0]);。但是行data.addRows(indata)给出了一个错误,抱怨类型不匹配。我该怎么做,为什么?

1 个答案:

答案 0 :(得分:0)

我不妨把它拿下来,但现在......

这里的违规事件不是日期,而是另一列,它将在Y轴上显示。它必须转换为数字格式。

#!/bin/bash

# Compare two version strings [$1: version string 1 (v1), $2: version string 2 (v2)]
# Return values:
#   0: v1 == v2
#   1: v1 > v2
#   2: v1 < v2
# Based on: https://stackoverflow.com/a/4025065 by Dennis Williamson
function compare_versions() {

    # Trivial v1 == v2 test based on string comparison
    [[ "$1" == "$2" ]] && return 0

    # Local variables
    local regex="^(.*)-r([0-9]*)$" va1=() vr1=0 va2=() vr2=0 len i IFS="."

    # Split version strings into arrays, extract trailing revisions
    if [[ "$1" =~ ${regex} ]]; then
        va1=(${BASH_REMATCH[1]})
        [[ -n "${BASH_REMATCH[2]}" ]] && vr1=${BASH_REMATCH[2]}
    else
        va1=($1)
    fi
    if [[ "$2" =~ ${regex} ]]; then
        va2=(${BASH_REMATCH[1]})
        [[ -n "${BASH_REMATCH[2]}" ]] && vr2=${BASH_REMATCH[2]}
    else
        va2=($2)
    fi

    # Bring va1 and va2 to same length by filling empty fields with zeros
    (( ${#va1[@]} > ${#va2[@]} )) && len=${#va1[@]} || len=${#va2[@]}
    for ((i=0; i < len; ++i)); do
        [[ -z "${va1[i]}" ]] && va1[i]="0"
        [[ -z "${va2[i]}" ]] && va2[i]="0"
    done

    # Append revisions, increment length
    va1+=($vr1)
    va2+=($vr2)
    len=$((len+1))

    # *** DEBUG ***
    #echo "TEST: '${va1[@]} (?) ${va2[@]}'"

    # Compare version elements, check if v1 > v2 or v1 < v2
    for ((i=0; i < len; ++i)); do
        if (( 10#${va1[i]} > 10#${va2[i]} )); then
            return 1
        elif (( 10#${va1[i]} < 10#${va2[i]} )); then
            return 2
        fi
    done

    # All elements are equal, thus v1 == v2
    return 0
}

# Test compare_versions [$1: version string 1, $2: version string 2, $3: expected result]
function test_compare_versions() {
    local op
    compare_versions "$1" "$2"
    case $? in
        0) op="==" ;;
        1) op=">" ;;
        2) op="<" ;;
    esac
    if [[ "$op" == "$3" ]]; then
        echo -e "\e[1;32mPASS: '$1 $op $2'\e[0m"
    else
        echo -e "\e[1;31mFAIL: '$1 $3 $2' (result: '$1 $op $2')\e[0m"
    fi
}

echo -e "\nThe following tests should pass:"
while read -r test; do
    test_compare_versions $test
done << EOF
1            1            ==
2.1          2.2          <
3.0.4.10     3.0.4.2      >
4.08         4.08.01      <
3.2.1.9.8144 3.2          >
3.2          3.2.1.9.8144 <
1.2          2.1          <
2.1          1.2          >
5.6.7        5.6.7        ==
1.01.1       1.1.1        ==
1.1.1        1.01.1       ==
1            1.0          ==
1.0          1            ==
1.0.2.0      1.0.2        ==
1..0         1.0          ==
1.0          1..0         ==
1.0-r1       1.0-r3       <
1.0-r9       2.0          <
3.0-r15      3.0-r9       >
...-r1       ...-r2       <
2.0-r1       1.9.8.21-r2  >
1.0          3.8.9.32-r   <
-r           -r3          <
-r3          -r           >
-r3          -r3          ==
-r           -r           ==
0.0-r2       0.0.0.0-r2   ==
1.0.0.0-r2   1.0-r2       ==
0.0.0.1-r7   -r9          >
0.0-r0       0            ==
1.002.0-r6   1.2.0-r7     <
001.001-r2   1.1-r2       ==
5.6.1-r0     5.6.1        ==
EOF

echo -e "\nThe following tests should fail:"
while read -r test; do
    test_compare_versions $test
done << EOF
1            1            >
3.0.5-r5     3..5-r5      >
4.9.21-r3    4.8.22-r9    <
1.0-r        1.0-r1       ==
-r           1.0-r        >
-r1          0.0-r1       <
-r2          0-r2         <
EOF

echo -e "\nThe following line should be empty (local variables test):"
echo "$op $regex $va1 $vr1 $va2 $vr2 $len $i $IFS"

真的很简单...