jQuery通过AJAX成功在JSON上循环吗?


152

在jQuery AJAX成功回调上,我想遍历对象的结果。这是响应在Firebug中的外观的一个示例。

[
 {"TEST1":45,"TEST2":23,"TEST3":"DATA1"},
 {"TEST1":46,"TEST2":24,"TEST3":"DATA2"},
 {"TEST1":47,"TEST2":25,"TEST3":"DATA3"}
]

如何遍历结果,以便可以访问每个元素?我已经尝试过类似下面的操作,但这似乎不起作用。

jQuery.each(data, function(index, itemData) {
  // itemData.TEST1
  // itemData.TEST2
  // itemData.TEST3
});

1
这应该工作。您确定这是完全相同的代码和相同的数据吗?
Tamas Czinege

Answers:


255

您可以删除外循环并替换thisdata.data

$.each(data.data, function(k, v) {
    /// do stuff
});

您接近:

$.each(data, function() {
  $.each(this, function(k, v) {
    /// do stuff
  });
});

您有一个对象/贴图数组,因此外循环遍历这些对象/贴图。内部循环遍历每个对象元素上的属性。


第一个循环用于“类别”,而其中的一个循环用于“属性”。那还怎么办?
dcolumbus

如果要使用object元素而不是其属性怎么办?为什么问题中的@aherrick循环不起作用?
StuperUser 2010年

1
如果该循环是在一个单独的功能使用用于$(data)代替data,否则变量k总是返回0
user1226868

2
有人可以解释传递给第二个函数的变量k和v吗?
布伦特·康纳

@BrentConnor在这种情况下,k&v表示循环遍历的数组的键和值。阅读jquery .each()函数
Ghost Echo

80

您还可以使用getJSON函数:

    $.getJSON('/your/script.php', function(data) {
        $.each(data, function(index) {
            alert(data[index].TEST1);
            alert(data[index].TEST2);
        });
    });

这确实只是ifesdjeen回答的改写,但我认为这可能对人们有所帮助。


这有帮助。由于某种原因,我无法获得@cletus的答案,但这确实可以。不确定关于jQuery的最大奥秘是什么,但是简单的代码并不总是能如您所愿。
AturSams

38

如果您使用Fire Fox,只需打开一个控制台(使用F12键)并尝试以下操作:

var a = [
 {"TEST1":45,"TEST2":23,"TEST3":"DATA1"},
 {"TEST1":46,"TEST2":24,"TEST3":"DATA2"},
 {"TEST1":47,"TEST2":25,"TEST3":"DATA3"}
];

$.each (a, function (bb) {
    console.log (bb);
    console.log (a[bb]);
    console.log (a[bb].TEST1);
});

希望能帮助到你


17

对于任何其他坚持这一点的人来说,它可能无法正常工作,因为ajax调用会将您返回的数据解释为文本-即,它还不是JSON对象。

您可以通过手动使用parseJSON命令或将dataType:'json'属性添加到您的ajax调用中,将其转换为JSON对象。例如

jQuery.ajax({
    type: 'POST',
    url: '<?php echo admin_url('admin-ajax.php'); ?>',
    data: data, 
    dataType: 'json', // ** ensure you add this line **
    success: function(data) {
        jQuery.each(data, function(index, item) {
            //now you can access properties using dot notation
        });
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("some error");
    }
});

这给我“数据未定义”。
休·希格雷夫斯

您应该使用自己的变量来存储要传递给url的数据。如果您的数据变量称为mydata,请使用数据:mydata
Dave Hilditch'Dave Hilditch

啊。现在明白了。谢谢。
休·希格雷夫斯

Uncaught TypeError: Cannot use 'in' operator to search for '188' in得到那个错误。
2013年

15

像访问其他数组一样访问json数组。

for(var i =0;i < itemData.length-1;i++)
{
  var item = itemData[i];
  alert(item.Test1 + item.Test2 + item.Test3);
}

1
一个老问题,但如何在不知道名称的情况下循环遍历json键...像Test1,Test2,ext ...
BarclayVision 2013年

@BarclayVision您只需将密钥用作数字即可。第一个键是[0],下一个键[1],依此类推。
copilot0910 2014年

我们可以在for循环中使用另一个ajax调用吗?如果是,那么请告诉我如何?
Jyoti Jadhav '18年

5

这是我想出的轻松查看所有数据值的方法:

var dataItems = "";
$.each(data, function (index, itemData) {
    dataItems += index + ": " + itemData + "\n";
});
console.log(dataItems);


4

尝试使用jQuery.map函数,与地图很好地兼容。

var mapArray = {
  "lastName": "Last Name cannot be null!",
  "email": "Email cannot be null!",
  "firstName": "First Name cannot be null!"
};

$.map(mapArray, function(val, key) {
  alert("Value is :" + val);
  alert("key is :" + key);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


2

如果您不想要警报,那就是您想要html,然后执行此操作

...
    $.each(data, function(index) {
        $("#pr_result").append(data[index].dbcolumn);
    });
...

注意:使用“ append”而不是“ html”,否则最后的结果是您将在html视图中看到的结果

那么您的html代码应如下所示

...
<div id="pr_result"></div>
...

您也可以在jQuery中将div样式化(添加类)到div,然后将其呈现为html。


0

如果您使用的是如下所示的JQuery ajax调用函数的short方法,则需要将返回的数据解释为json对象,以便您能够进行遍历。

$.get('url', function(data, statusText, xheader){
 // your code within the success callback
  var data = $.parseJSON(data);
  $.each(data, function(i){
         console.log(data[i]);
      })
})


0

$each将会起作用。另一个选项是数组结果的jQuery Ajax回调

function displayResultForLog(result) {
  if (result.hasOwnProperty("d")) {
    result = result.d
  }

  if (result !== undefined && result != null) {
    if (result.hasOwnProperty('length')) {
      if (result.length >= 1) {
        for (i = 0; i < result.length; i++) {
          var sentDate = result[i];
        }
      } else {
        $(requiredTable).append('Length is 0');
      }
    } else {
      $(requiredTable).append('Length is not available.');
    }

  } else {
    $(requiredTable).append('Result is null.');
  }
}

0

我使用.map for foreach。例如

success: function(data) {
  let dataItems = JSON.parse(data)
  dataItems = dataItems.map((item) => {
    return $(`<article>
                <h2>${item.post_title}</h2>
                <p>${item.post_excerpt}</p>
              </article>`)
  })
},
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.