jQuery Json Объект .each () l oop возвращается неопределенным - PullRequest
0 голосов
/ 01 февраля 2020

Я видел похожие посты по этой проблеме, но не нашел решения, которое бы сработало для меня.

My Json, действительное в Jsonlint:

{
    "genre": {
        "id": 44,
        "text": "Mystery"
    },
    "status": "11 episodes",
    "director": {
        "id": [
            83,
            84,
            85
        ],
        "text": [
            "Matsuyama Hiroaki",
            "Aizawa Hideyuki",
            "Mihashi Toshiyuki"
        ]
    }
}

Мой ajax вызов:

$.ajax({
      url: link, //link to php file
      type: "POST",
      data: postForm,
      dataType  : 'json',
      success: function (data) {
         console.log(data);
         if(data !== "fail"){
             $.each(data.director, function(i, term) {
                $('#acf-field_5dc7e03cd489d').append(new Option(term.text, term.id, true, true)).trigger('change');
             }); // Append options to field in post editor

            $("#get_all").val("Submit");
            $("#get_all").removeAttr('disabled');
         }else{
            alert("fail");
            $("#get_all").val("Submit");
            $("#get_all").removeAttr('disabled');
         }     

      },
      error: function(jqXHR, textStatus, errorThrown) {
         console.log(textStatus, errorThrown);
         $("#get_all").val("Submit");
         $("#get_all").removeAttr('disabled');
      }
  });

Это создает параметры, но пусто, консоль показывает неопределенный.

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

«data.director» - это не массив, а «data.director.id», так что именно здесь должно произойти l oop. Ниже будет работать коррекция:)

$.each(data.director.id, function(i, term) {
  $('#acf-field_5dc7e03cd489d').append(new Option(data.director.text[i], term, true, true)).trigger('change');
});
1 голос
/ 01 февраля 2020

Когда вы вызываете $.each для объекта, первый параметр обратного вызова - это имя свойства, а второй - его значение. Итак, когда вы выполните:

$.each(data.director, function(i, term) {
    $('#acf-field_5dc7e03cd489d').append(new Option(term.text, term.id, true, true)).trigger('change');
});

с данными, которые вы разместили, они будут выполняться дважды. На первой итерации i примет значение id, а term будет массив [83,84,85]. Во второй итерации i примет значение text, а term будет массив ["Matsuyama Hiroaki","Aizawa Hideyuki","Mihashi Toshiyuki"].

. Если вы хотите добавить опции, основанные как на id, так и на text, вы может сделать что-то вроде:

data.director.id.forEach(function(id, index) {
    $('#acf-field_5dc7e03cd489d').append(new Option(data.director.text[index], id, true, true)).trigger('change');
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...