【问题标题】:jQuery each loop with single object returns "undefined"jQuery 每个带有单个对象的循环都返回“未定义”
【发布时间】:2014-05-28 22:17:10
【问题描述】:

我有一个调用 ASP.NET Web API 的 jQuery 函数。我知道 API 成功返回了一个客户端对象,因为我可以直接输入 API url 并且对象信息在浏览器中以 XML 格式显示。 JSON 数据作为集合返回,jQuery 循环遍历 <option> 元素并将其附加到 <select> 元素。

我遇到的问题是如何使用 jQuery 来显示结果。 jQuery 可以很好地显示一组对象,但是如果只返回一个对象,它会为 <option> 元素显示“未定义”。

   function searchClients() {
      var uri = 'api/clients';
      var searchParam = $('#SearchTerm').val();
      $.getJSON(uri + '/' + searchParam)
        .done(function (data) {
          $('#selSearchResults').show(); // Displays hidden select element
          $('#selSearchResults').html(""); // Clear any pre-existing data in select element
          $.each(data, function (key, item) {
            $('#selSearchResults')
              .append('<option value="' + key + '">' + item.OrgName + ' - ' + item.ID + '</option>');
          })
        })
        .fail(function (jqXHR, textStatus, err) {
            $('#ErrorMessage').text('Error: ' + err);
        });
    }

如果.each 函数接收到data 的单个对象,是否会返回未定义?如果是这样,如何解释可能包含单个对象或仅包含一个对象的结果?我认为.each 会解决这个问题。

【问题讨论】:

  • 然后先检查返回的data是集合还是单个对象。
  • 或者更确切地说,确保您请求数据的端点始终提供一个数组/对象,而不仅仅是一个值——行为应该是一致的。
  • 您确定data[1].item.OrgName 有价值吗?在我看来 OrgNameIDundefined
  • @WereWolf @CBroe@ - .each 不会迭代单个对象吗?在迭代之前是否总是需要检查结果对象集合是否有一个或多个成员?我希望在示例中看到更多这一点,因为查询不知道可能返回多少结果。

标签: jquery json


【解决方案1】:

解决了!问题是返回了一个对象,当这种情况发生时,each() 函数会遍历对象的属性。解决方案是将单个对象“包装”到一个数组中,以便each() 能够正确迭代。我将此行添加到我的 jQuery ...

if (!jQuery.isArray(data)) data = [data]; // If a single object is returned, wrap it in an array

它在整个函数中。

function searchClients() {
   var uri = 'api/clients';
   var searchParam = $('#SearchTerm').val();
   $.getJSON(uri + '/' + searchParam)
     .done(function (data) {
       $('#selSearchResults').show(); // Displays hidden select element
       $('#selSearchResults').html(""); // Clear any pre-existing data in select element
       if (!jQuery.isArray(data)) data = [data]; // If a single object is returned, wrap it in an array
       $.each(data, function (key, item) {
         $('#selSearchResults')
           .append('<option value="' + key + '">' + item.OrgName + ' - ' + item.ID + '</option>');
       })
     })
     .fail(function (jqXHR, textStatus, err) {
         $('#ErrorMessage').text('Error: ' + err);
     });
}

我从下面的SO article - JSON result containing only one item 找到了这个问题的解决方案,并查看了@CMS 的答案。

【讨论】:

    【解决方案2】:

    我坚信您的 API 有问题。 例如,检查您是否真的发送了一个数组或对象。

    确保您的数据如下所示: var data = [ {ID: 01, OrgName: "Organization1"}, {ID: 02, OrgName: "Organization2"}, {ID: 03, OrgName: "Organization3"} ];

    你可以在这里玩数据:http://jsfiddle.net/lcustodio/FBdSj/

    【讨论】:

    • 我可以确认,在这种情况下,API 正在返回单个对象。我只是很困惑为什么即使集合中只有一个对象,.each 也不会遍历一次。
    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多