dongmingxiang0312
dongmingxiang0312
2018-08-31 08:38

NaN on ajax请求返回数据

on the php side of the api I have this:

$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;
}

and I've tried to return some more data as an array from the api. and on the javascript side when I JSON.parse the returned data I get all the data correctly as below: eg:

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

the zero is the return 0; from the php side, The problem is when I console.log the 3rd property it is undefined or when I parseInt it, it returns NaN while the 3rd property of the returned data as shown is zero.

this is the actual 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

and this is the data echo to the api:

{"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}

how could I possibly solve it.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • dquh37673 dquh37673 3年前

    Your code is trying to access the item at index 5 in the Object.keys array, which would be the 6th item. However you have a gap in the key numbering - 4 is not included.

    Therefore the object with the key "5" is actually the 5th item in the list of keys, and therefore accessible at index 4 - because the array of keys is zero-based, like all JS arrays. There is no 6th item - the object only has 5 keys.

    I think because the object keys are numeric you have got confused between the name of the key and its position in the list of keys.

    Observe the difference between the last 2 console.logs in this (runnable) example:

    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]]);

    However you could greatly simplify this. If you already know you want the item whose key is called "5" then you can simply access it directly:

    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]);

    </div>
    
    点赞 评论 复制链接分享
  • duanhuoyao7011 duanhuoyao7011 3年前

    you have been mixing objects with arrays indexing, this must work for you: allData[5] will return the value of it.

    点赞 评论 复制链接分享
  • ds261634878 ds261634878 3年前

    I created two jsfiddles:

    One without 5 key in array (returns undefined) jsfiddle without 5// allData = {0:'abc',1:'def',2:'ghi',3:'dlsdds',4:'dasdas'}; var ret = allData[Object.keys(allData)[5]]; console.log(ret);

    Second with 5 kry in array (return real value) 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);

    Compare and you can see the difference

    点赞 评论 复制链接分享

相关推荐