NaN по запросу ajax вернул данные - PullRequest
0 голосов
/ 31 августа 2018

на стороне PHP API, у меня есть это:

$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

ноль - return 0; со стороны php, Проблема в том, что когда I console.log 3-е свойство это undefined или когда I parseInt оно возвращает 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

и это данные echo к 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}

как я мог это решить.

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Ваш код пытается получить доступ к элементу с индексом 5 в массиве Object.keys, который будет 6-м элементом. Однако у вас есть пробел в нумерации ключей - 4 не включены.

Следовательно, объект с ключом «5» на самом деле является 5-м элементом в списке ключей и, следовательно, доступен по индексу 4, поскольку массив ключей начинается с нуля, как и все массивы JS. 6-го предмета нет - объект имеет только 5 ключей.

Я думаю, что из-за того, что ключи объекта являются числовыми, вы запутались между названием ключа и его положением в списке ключей.

Обратите внимание на разницу между последними 2 логами 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]);
0 голосов
/ 02 сентября 2018

вы смешивали объекты с индексацией массивов, это должно работать для вас: allData[5] вернет значение.

0 голосов
/ 31 августа 2018

Я создал два jsfiddles:

Один без 5 ключей в массиве (возвращает неопределенное значение) jsfiddle без 5 // allData = {0:'abc',1:'def',2:'ghi',3:'dlsdds',4:'dasdas'}; var ret = allData[Object.keys(allData)[5]]; console.log(ret);

Второй с 5 кри в массиве (возвращает реальное значение) jsfiddle с 5 // allData = {0:'abc',1:'def',2:'ghi',3:'dlsdds',4:'dasdas',5:'sddsds'}; var ret = allData[Object.keys(allData)[5]]; console.log(ret);

Сравните и вы увидите разницу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...