JavaScript数组周围的引号(可能很容易修复)

Quotes Around JavaScript Arrays (Probably Very Easy Fix)

本文关键字:很容易 周围 数组 JavaScript      更新时间:2024-03-14

我的数组中的引号有问题,这可能是一个超级简单的修复,但我只是不知道我到底应该如何解决它。

我正在使用JQPlot来制作我的社交媒体信息的图表,如Facebook喜欢,Twitter关注者等。最初,当我加载页面时,我会显示过去两周的所有内容。

然后,我使用原型库CalenderDateSelect为日期添加了两个输入。除了这个之外,我使用jQuery做其他所有事情,所以我所有的jQuery选择器都是:

j$('element').functon();

我在PHP的帮助下引入了我原来的javascript数组。它们如下所示:

<script>
likes=[
  <?
    $i = 0;
    while($like = mysql_fetch_assoc($fb_data)) {
        $d_day = date("d-M-y", $like['date']);
        if ($i > 0) {
            echo ',';
        }
        echo "['".$d_day."', ".$like['likes']."]";
        $i++;
    }
  ?>];
<? mysql_data_seek($fb_data, 0); ?>//this resets $fb_data so I can use it again
dislikes=[
  <?
    $i = 0;
    while($like = mysql_fetch_assoc($fb_data)) {
        $d_day = date("d-M-y", $like['date']);
        if ($i > 0) {
            echo ',';
        }
        echo "['".$d_day."', ".$like['dislikes']."]";
        $i++;
    }
  ?>];
<? mysql_data_seek($fb_data, 0); ?>
impressions=[
  <?
    $i = 0;
    while($like = mysql_fetch_assoc($fb_data)) {
        $d_day = date("d-M-y", $like['date']);
        if ($i > 0) {
            echo ',';
        }
        echo "['".$d_day."', ".$like['impressions']."]";
        $i++;
    }
  ?>];
</script>

然后我把它们放到一个函数中:

socialMedia(likes, dislikes, impressions,false);

此函数执行以下操作(为便于阅读而简化(

function socialMedia(likes, dislikes, impressions, bool) {
console.log(likes);
console.log(dislikes);
console.log(impressions);
var plot1 = j$.jqplot('chart1', [likes, dislikes, impressions], {
    title:'Facebook Stats' });
if (bool) {
    plot1.destroy();
    j$.jqplot('chart1', [likes, dislikes, impressions], {
    title:'Facebook Stats' }).replot();
}   
}

此处的控制台日志执行以下操作(正确(:

[["19-Nov-13", 163], ["20-Nov-13", 163], ["21-Nov-13", 164], ["22-Nov-13", 165], ["23-Nov-13", 168], ["24-Nov-13", 181], ["25-Nov-13", 205], ["26-Nov-13", 226], ["27-Nov-13", 244], ["28-Nov-13", 250], ["29-Nov-13", 269], ["30-Nov-13", 306], ["01-Dec-13", 313], ["02-Dec-13", 315]]
[["19-Nov-13", 0], ["20-Nov-13", 0], ["21-Nov-13", 0], ["22-Nov-13", 0], ["23-Nov-13", 1], ["24-Nov-13", 1], ["25-Nov-13", 0], ["26-Nov-13", 1], ["27-Nov-13", 0], ["28-Nov-13", 1], ["29-Nov-13", 0], ["30-Nov-13", 0], ["01-Dec-13", 0], ["02-Dec-13", 0]]
[["19-Nov-13", 68], ["20-Nov-13", 116], ["21-Nov-13", 63], ["22-Nov-13", 15896], ["23-Nov-13", 79617], ["24-Nov-13", 42948], ["25-Nov-13", 22290], ["26-Nov-13", 1369], ["27-Nov-13", 928], ["28-Nov-13", 921], ["29-Nov-13", 631], ["30-Nov-13", 700], ["01-Dec-13", 743], ["02-Dec-13", 300]]

请注意日-月-年周围的引号。

到目前为止,一切正常。

然后,我更改结束日期 (e( 和开始日期 (s( 输入,并在执行此操作时调用此函数:

function getNewSocialData(e, s) {
    j$.ajax({
         type: 'GET',
         url: 'ajax/social_media.php?e='+e+'&s='+s,
         success:function(json){
            data = json;
            data = json.split("T");
            socialMedia(data[0],data[1],data[2],true);
         },
         error: function (xhr, ajaxOptions, thrownError) {
            alert('There appears to be a problem with the information you submitted. Please try again or contact us.');
          }
    });
}

在social_media.php中,我执行以下操作:

$end_date = date("Y-m-d 00:00", strtotime($_GET['e']));
$start_date = date("Y-m-d 00:00", strtotime($_GET['s']));
$fb_data = getFacebookData(strtotime($start_date), strtotime($end_date));
$inside_likes = array();
$inside_dislikes = array();
$inside_impressions = array();
$i = 0;
while($like = mysql_fetch_assoc($fb_data)) {
    $d_day = date("d-M-y", $like['date']);
    $string = $i != 0 ? ',' : '';
    $inside_likes[] = $string.'"'.$d_day.'",'.$like['likes'];
    $inside_dislikes[] = $string.'"'.$d_day.'",'.$like['dislikes'];
    $inside_impressions[] = $string.'"'.$d_day.'",'.$like['impressions'];
    $i++;
}   
$data['likes'][] = $inside_likes;
$data['dislikes'][] = $inside_dislikes;
$data['impressions'][] = $inside_impressions;
foreach ($data as $data_part) {
   foreach ($data_part as $part) {
       foreach($part as $info) {
           echo $info;   
       }
   echo 'T'; //we split on this 
   }
}

然后,我们获取这些数据,正如您在 ajax 调用中看到的那样,我们通过 socialMedia(( 函数和控制台运行它.log数据。这次我的数据如下:

"20-Nov-13",163,"21-Nov-13",164,"22-Nov-13",165,"23-Nov-13",168,"24-Nov-13",181,"25-Nov-13",205,"26-Nov-13",226,"27-Nov-13",244,"28-Nov-13",250,"29-Nov-13",269,"30-Nov-13",306,"01-Dec-13",313,"02-Dec-13",315
"20-Nov-13",0,"21-Nov-13",0,"22-Nov-13",0,"23-Nov-13",1,"24-Nov-13",1,"25-Nov-13",0,"26-Nov-13",1,"27-Nov-13",0,"28-Nov-13",1,"29-Nov-13",0,"30-Nov-13",0,"01-Dec-13",0,"02-Dec-13",0
"20-Nov-13",116,"21-Nov-13",63,"22-Nov-13",15896,"23-Nov-13",79617,"24-Nov-13",42948,"25-Nov-13",22290,"26-Nov-13",1369,"27-Nov-13",928,"28-Nov-13",921,"29-Nov-13",631,"30-Nov-13",700,"01-Dec-13",743,"02-Dec-13",300

而且,如您所见,这些不是数组,它们是字符串,因此 JQPlot 抛出错误"未捕获的异常:无数据"。然后,我们修改成功条件以将它们放入数组中:

success:function(json){
    var likes = [];
    var dislikes = [];
    var impressions = [];
    var followers = [];
    var following = [];
    var tweets = [];
data = json;
data = json.split("T");
likes.push(data[0]);
dislikes.push(data[1]);
impressions.push(data[2]);
followers.push(data[3]);
following.push(data[4]);
tweets.push(data[5]);
socialMedia(likes,dislikes,impressions,true);
    }....

它控制台如下:

[""20-Nov-13",163,"21-Nov...13",313,"02-Dec-13",315"]
[""20-Nov-13",0,"21-Nov-1...Dec-13",0,"02-Dec-13",0"]
[""20-Nov-13",116,"21-Nov...13",743,"02-Dec-13",300"]

它在那里有我的所有数据,但在引号内,导致 JQPlot 无法解析它,并将我的图表默认为 1969 年 12 月 31 日。

所以,我

的问题:我如何以这样的方式推送数据,以便报价不会绕过它?我觉得我可能以某种方式在这里混淆了一个字符串和一个数组。有人可以指出我正确的方向吗?

谢谢一百万!

编辑:

谢谢大家的帮助。我越来越近了。我将我的 PHP 更改为这样运行:

while($like = mysql_fetch_assoc($fb_data)) {
$d_day = date("d-M-y", $like['date']);
$inside_likes[] = array('"'.$d_day.'",'.$like['likes']);
$inside_dislikes[] = array('"'.$d_day.'",'.$like['dislikes']);
$inside_impressions[] = array('"'.$d_day.'",'.$like['impressions']);
}   
$data['likes'] = $inside_likes;
$data['dislikes'] = $inside_dislikes;
$data['impressions'] = $inside_impressions;
echo json_encode($data);
exit;

我的 AJAX 调用现在执行以下操作:

j$.ajax({
         type: 'GET',
         url: 'ajax/social_media.php?e='+e+'&s='+s,
     dataType : "json",
         success:function(json){
            var likes = json['likes'];
            var dislikes = json['dislikes'];
            var impressions = json['impressions'];
    socialMedia(likes, dislikes, impressions, true);
         },
        ...
    });

但是现在,当我安慰它时.log它,我得到了这个,请注意双引号。

[[""19-Nov-13",163"], [""20-Nov-13",163"], [""21-Nov-13",164"], [""22-Nov-13",165"], [""23-Nov-13",168"], [""24-Nov-13",181"], [""25-Nov-13",205"], [""26-Nov-13",226"], [""27-Nov-13",244"], [""28-Nov-13",250"], [""29-Nov-13",269"], [""30-Nov-13",306"], [""01-Dec-13",313"], [""02-Dec-13",315"]]

当我应该得到这个时:

[["19-Nov-13", 163], ["20-Nov-13", 163], ["21-Nov-13", 164], ["22-Nov-13", 165], ["23-Nov-13", 168], ["24-Nov-13", 181], ["25-Nov-13", 205], ["26-Nov-13", 226], ["27-Nov-13", 244], ["28-Nov-13", 250], ["29-Nov-13", 269], ["30-Nov-13", 306], ["01-Dec-13", 313], ["02-Dec-13", 315]]

有人有什么建议吗?谢谢!

溶液:

在下面的帮助下,获取字符串和整数格式数组的答案是执行以下操作:

while($like = mysql_fetch_assoc($fb_data)) {
$d_day = date("d-M-y", $like['date']);
$inside_likes[] = array($d_day, intval($like['likes']));
$inside_dislikes[] = array($d_day, intval($like['dislikes']));
$inside_impressions[] = array($d_day, intval($like['impressions']));
}   
$data['likes'] = $inside_likes;
$data['dislikes'] = $inside_dislikes;
$data['impressions'] = $inside_impressions;
echo json_encode($data);

social_media.php中,您似乎在推动字符串而不是数组。

这似乎是错误的:

$inside_likes[] = $string.'"'.$d_day.'",'.$like['likes'];

试试这个:

$inside_likes[] = array($string.'"'.$d_day, $like['likes']);

看起来您正在脚本中构建自己的 JSON。这不是一个好主意。我会研究使用 json_encode() 格式化 JSON。

更新:

每个数组应包含两个元素:日期字符串和点赞数。您当前正在做的是将两者连接成一个字符串,这不是您想要的。

试试这个:

$inside_impressions[] = array($d_day, $like['impressions']);