NaN по запросу ajax вернул данные

0

на 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 возвращенных данных, я получаю все данные правильно, как JSON.parse ниже: например:

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

нуль - это return 0; со стороны php. Проблема заключается в том, когда я console.log третьего свойства он не undefined или когда я parseInt его, он возвращает NaN а третий свойство возвращаемых данных, как показано, равно нулю.

это фактический 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}

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

  • 1
    Как вы анализируете ответ?
  • 1
    покажите нам заявление console.log.
Показать ещё 13 комментариев

3 ответа

1
Лучший ответ

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

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

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

Обратите внимание на разницу между последними 2 console.logs в этом примере (runnable):

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
    отредактировал код. мои фактические данные - объект с 6 свойствами
  • 0
    это довольно существенная разница. Почему вы показали нам неправильные данные для начала, когда все дело в структуре данных?
Показать ещё 3 комментария
1

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

0

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

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

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

Сравните, и вы можете увидеть разницу

  • 0
    отредактировал код. мои фактические данные - объект с 6 свойствами

Ещё вопросы

Сообщество Overcoder
Наверх
Меню