NaN对Ajax请求返回数据

时间:2018-08-31 08:38:16

标签: javascript php ajax reactjs

在api的php端,我有这个:

$res = $db->query("SELECT count(upVote) FROM tbl_post_likers WHERE post_id='$pnum' AND upVote='true'");
$row = $res->fetchArray();
if($row[0] > 0){
    $upVotes = $row[0];
    $res = $db->query("SELECT count(downVote) FROM tbl_post_likers WHERE post_id='$pnum' AND downVote='true'");
    $row = $res->fetchArray();
    $downVotes = $row[0];

    $tot = $upVotes + $downVotes;
    $upVotesPer = ($upVotes * 100) / $tot;
    $downVotesPer = ($downVotes * 100) / $tot;
    return $upVotesPer - $downVotesPer;
}else if ($row[0] == 0){
    return 0;
}

并且我试图从api作为数组返回更多数据。 在JavaScript端,当我JSON.parse返回的数据时,我正确地获得了所有数据,如下所示: 例如:

0: [...],
1: [...],
2: 0

从php的角度来看,零是return 0;, 问题是当我console.log的第3个属性是undefined或当我parseInt的第3个属性时,它返回NaN,而返回数据的第3个属性如图所示。

这是实际的console.log

0 : "{"0":2,"id":2,"1":"0.jpg","image":"0.jpg","2":"Proj 1","title":"Proj 1","3":"some description here about the course!","desc":"some description here about the course!","4":"sinawic","teacher":"sinawic","5":0,"sell_count":0,"6":"1997.05.05","date_released":"1997.05.05","7":97,"preview":97,"8":0,"likes":0,"9":0,"post_point":0,"10":0,"post_cash":0}" 1 : "["jquery","vue"]" 2 : "[{"lesson_num":1,"topic_name":"pre"}]" 3 : "{"0":"sinawic","username":"sinawic","1":"web design, React, VUE, javascript","fields_name":"web design, React, VUE, javascript","2":"this is all about me, oke? call me maybe","description":"this is all about me, oke? call me maybe","3":"85%, 53%, 36%, 74%, 17%","ranks":"85%, 53%, 36%, 74%, 17%"}" 5 : 0

这是api的数据echo

{"0":"{\"0\":2,\"id\":2,\"1\":\"0.jpg\",\"image\":\"0.jpg\",\"2\":\"Proj 1\",\"title\":\"Proj 1\",\"3\":\"some description here about the course!\",\"desc\":\"some description here about the course!\",\"4\":\"sinawic\",\"teacher\":\"sinawic\",\"5\":0,\"sell_count\":0,\"6\":\"1997.05.05\",\"date_released\":\"1997.05.05\",\"7\":98,\"preview\":98,\"8\":0,\"likes\":0,\"9\":0,\"post_point\":0,\"10\":0,\"post_cash\":0}","1":"[\"jquery\",\"vue\"]","2":"[{\"lesson_num\":1,\"topic_name\":\"pre\"}]","3":"{\"0\":\"sinawic\",\"username\":\"sinawic\",\"1\":\"web design, React, VUE, javascript\",\"fields_name\":\"web design, React, VUE, javascript\",\"2\":\"this is all about me, oke? call me maybe\",\"description\":\"this is all about me, oke? call me maybe\",\"3\":\"85%, 53%, 36%, 74%, 17%\",\"ranks\":\"85%, 53%, 36%, 74%, 17%\"}","5":0}

我怎么可能解决它。

3 个答案:

答案 0 :(得分:1)

您的代码正在尝试访问Object.keys数组中索引5处的项目,该项目将是第6个项目。但是,密钥编号之间有空隙-不包括4。

因此,键为“ 5”的对象实际上是键列表中的第五项,因此可以从索引4访问-因为键数组像所有JS数组一样都是从零开始的。没有第六项-该对象只有5个键。

我认为,因为对象键是数字,所以您在键的名称及其在键列表中的位置之间感到困惑。

在此(可运行)示例中,观察最后两个console.logs之间的差异:

var allData = { 0:{"0":2,"id":2,"1":"0.jpg","image":"0.jpg","2":"Proj 1","title":"Proj 1","3":"some description here about the course!","desc":"some description here about the course!","4":"sinawic","teacher":"sinawic","5":0,"sell_count":0,"6":"1997.05.05","date_released":"1997.05.05","7":97,"preview":97,"8":0,"likes":0,"9":0,"post_point":0,"10":0,"post_cash":0},
1:["jquery","vue"],
2:[{"lesson_num":1,"topic_name":"pre"}],
3:{"0":"sinawic","username":"sinawic","1":"web design, React, VUE, javascript","fields_name":"web design, React, VUE, javascript","2":"this is all about me, oke? call me maybe","description":"this is all about me, oke? call me maybe","3":"85%, 53%, 36%, 74%, 17%","ranks":"85%, 53%, 36%, 74%, 17%"},
5:0 };

console.log(Object.keys(allData));

console.log(allData[Object.keys(allData)[5]]);

console.log(allData[Object.keys(allData)[4]]);

但是,您可以大大简化此过程。如果您已经知道想要键名为“ 5”的项目,则可以直接访问它:

var allData = { 0:{"0":2,"id":2,"1":"0.jpg","image":"0.jpg","2":"Proj 1","title":"Proj 1","3":"some description here about the course!","desc":"some description here about the course!","4":"sinawic","teacher":"sinawic","5":0,"sell_count":0,"6":"1997.05.05","date_released":"1997.05.05","7":97,"preview":97,"8":0,"likes":0,"9":0,"post_point":0,"10":0,"post_cash":0},
1:["jquery","vue"],
2:[{"lesson_num":1,"topic_name":"pre"}],
3:{"0":"sinawic","username":"sinawic","1":"web design, React, VUE, javascript","fields_name":"web design, React, VUE, javascript","2":"this is all about me, oke? call me maybe","description":"this is all about me, oke? call me maybe","3":"85%, 53%, 36%, 74%, 17%","ranks":"85%, 53%, 36%, 74%, 17%"},
5:0 };

console.log(allData[5]);

答案 1 :(得分:1)

您一直在将对象与数组索引混合, 这必须为您工作: allData[5]将返回它的值。

答案 2 :(得分:0)

我创建了两个jsfiddles:

一个没有5个键的数组(返回未定义) jsfiddle without 5 // allData = {0:'abc',1:'def',2:'ghi',3:'dlsdds',4:'dasdas'}; var ret = allData[Object.keys(allData)[5]]; console.log(ret);

其次是数组中的5 kry(返回实际值) jsfiddle with 5 // allData = {0:'abc',1:'def',2:'ghi',3:'dlsdds',4:'dasdas',5:'sddsds'}; var ret = allData[Object.keys(allData)[5]]; console.log(ret);

比较,就可以看到区别