Проблема с получением длины массива из запроса JSON ajax в JavaScript, когда массив не является объектом

#jquery #ajax #arrays #json

#jquery #ajax #массивы #json

Вопрос:

У меня проблема с получением длины массива, когда он не инициализирован в формате: var variable = new Array();

Вот мой код:

 var inx;
var qns;
var qis;
var ncs;
var nzs;
var tps;

function display_question()
{

   $( "#question_no" ).text( qns[ inx ] );
   $( "#question_nc" ).text( ncs[ inx ] );
   $( "#question_nz" ).text( nzs[ inx ] );
   $( "#the_question" ).hide();
   $( "#the_question" ).text( tps[ inx ] );
   $( "#the_question" ).fadeIn( 500 );

}

function next_question()
{

   var arr_len = qns.length;

   if( inx < arr_len )
   {

      inx  ;
      display_question();

   }

}

function prev_question()
{

   if( inx > 0 )
   {

      inx--;
      display_question();

   }

}

function get_questions()
{

   var url = "php/pytania.php"; 

   $.ajax(
   {

      cache: false,
      async: false,
      type: "GET",
      dataType: "text",
      url: url,
      success: function( response ) 
      { 

         data = jQuery.parseJSON( response );

         inx = 0;
         qns = data.qns;
         qis = data.qis;
         ncs = data.ncs;
         nzs = data.nzs;
         tps = data.tps;
         display_question();

      }

   } );

}
  

Проблема в том, что когда я пытаюсь вернуть длину qns вот так: qns.length , это ничего не возвращает. Я подозреваю, что это может быть связано с тем, что когда я читаю в массиве из ответа JSON, он не является объектом массива. Есть ли какой-либо способ исправить это? Я был бы признателен за любую помощь! 🙂

Комментарии:

1. Не могли бы вы, пожалуйста, показать ответ JSON? Скорее всего, это не работает, потому что это не массив, а объект. Кстати. массивы не обязательно инициализировать таким образом. Массивы и объекты JSON преобразуются в массивы и объекты JS. Разницы нет.

2. да, когда я вывожу qns с предупреждением, вот что я получаю: [object Объект] — есть ли какой-либо способ преобразовать его в массив без необходимости проходить через него? любопытно, что когда я вывожу qns [index] — он отображает содержимое правильно…

3. Так это особенно касается data.qns ? Если это не массив, вам нужно выполнить цикл по нему и посчитать элементы. Но если у вас есть непрерывные цифровые клавиши, то было бы лучше исправить JSON для создания массива. Итак, что data.qns содержит и как вы создаете JSON?

4. Я создаю JSON с помощью внутреннего PHP-скрипта, примерно так: $ json_array = array ( «qns» => $ qns, «qis» => $ qis, «ncs» => $ ncs, «nzs» => $ nzs, «tps» => $ tps); echo json_encode ($ json_array, JSON_FORCE_OBJECT);

5. Является $qns массивом? Если это так, просто используйте echo json_encode($json_array); , чтобы позволить PHP создать массив JSON. Объекты здесь не нужны. Тогда qns.length все будет работать так, как ожидалось. Ассоциативные в любом случае преобразуются в объекты. Но если вы используете JSON_FORCE_OBJECT , то будут и числовые массивы.

Ответ №1:

Нет разницы между массивами / объектами, которые вы извлекаете через JSON, и теми, которые созданы в JavaScript. Объекты JSON и массивы преобразуются в объекты JavaScript.
И фактически нет необходимости вызывать new Array() когда-либо.

Кажется, data.qnr это объект, а не массив. Вам пришлось бы перебирать объекты и считать элементы самостоятельно.

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

В своих комментариях вы написали, что используете json_encode( $json_array, JSON_FORCE_OBJECT ) для создания выходных данных JSON. Это преобразует каждый массив, даже числовые, в объекты.

Вместо этого просто используйте json_encode($json_array) . По умолчанию PHP преобразует ассоциативные массивы в объекты в формате JSON , а числовые массивы — в … ну и массивы 😉

Если вы сделаете это, data.qnr все будет работать так, как ожидалось в JavaScript.


Также обратите внимание, что вместо dataType: 'text' вы можете установить для него значение json , и jQuery автоматически проанализирует ответ для вас (поэтому нет необходимости вызывать jQuery.parseJSON ).