【问题标题】:jQuery Json Object .each() loop is returning undefinedjQuery Json Object .each() 循环返回未定义
【发布时间】:2020-02-01 14:47:58
【问题描述】:

我已经看到了关于这个问题的类似帖子,但没有找到适合我的解决方案。

我的 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');
      }
  });

它正在创建选项但空白,控制台显示未定义。

【问题讨论】:

标签: jquery json ajax wordpress


【解决方案1】:

当您在对象上调用$.each 时,回调的第一个参数是属性名称,第二个参数是其值。所以,当你这样做时:

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

使用您发布的数据,它将运行两次。在第一次迭代中,i 将采用值 idterm 将是数组 [83,84,85]。在第二次迭代中,i 将采用 text 的值,term 将是数组 ["Matsuyama Hiroaki","Aizawa Hideyuki","Mihashi Toshiyuki"]

如果您想添加基于 idtext 的选项,您可以执行以下操作:

data.director.id.forEach(function(id, index) {
    $('#acf-field_5dc7e03cd489d').append(new Option(data.director.text[index], id, true, true)).trigger('change');
}); 

【讨论】:

    【解决方案2】:

    'data.director' 不是数组,但 'data.director.id' 是,所以这是循环需要发生的地方。以下更正将起作用:)

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

    【讨论】:

      猜你喜欢
      • 2012-11-29
      • 2013-02-19
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多