Vòng lặp jQuery trên kết quả JSON từ AJAX Thành công?


152

Trên cuộc gọi lại thành công jQuery AJAX, tôi muốn lặp lại kết quả của đối tượng. Đây là một ví dụ về cách phản hồi trông như thế nào trong Fireorms.

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

Làm thế nào tôi có thể lặp lại các kết quả để tôi có quyền truy cập vào từng yếu tố? Tôi đã thử một cái gì đó như dưới đây nhưng điều này dường như không hoạt động.

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

1
Điều này nên làm việc. Bạn có chắc chắn đó chính xác là cùng một mã và cùng một dữ liệu?
Tamas Czinege

Câu trả lời:


255

bạn có thể loại bỏ vòng lặp bên ngoài và thay thế thisbằng data.data:

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

Bạn đã gần:

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

Bạn có một mảng các đối tượng / bản đồ để vòng lặp bên ngoài lặp lại trên các đối tượng đó. Vòng lặp bên trong lặp lại qua các thuộc tính trên mỗi thành phần đối tượng.


Vòng lặp đầu tiên dành cho "danh mục" trong khi vòng lặp trong đó dành cho "thuộc tính". Làm thế nào khác được thực hiện?
dcolumbus

Điều gì nếu bạn muốn làm việc với các phần tử đối tượng hơn là các thuộc tính của nó? Tại sao vòng lặp của @ aherrick không hoạt động?
StuperUser

1
Nếu vòng lặp này được sử dụng trong một chức năng riêng biệt sử dụng $(data)thay vì data, nếu không, biến kluôn trả về 0.
user1226868

2
Ai đó có thể giải thích các biến k & v được truyền cho hàm thứ hai không?
Brent Connor

@BrentConnor trong trường hợp này k & v đại diện cho khóa & giá trị của mảng được chuyển qua. Đọc lên hàm jquery .each ()
Ghost Echo

80

Bạn cũng có thể sử dụng hàm getJSON :

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

Đây thực sự chỉ là một bản viết lại câu trả lời của ifesdjeen, nhưng tôi nghĩ nó có thể hữu ích cho mọi người.


Điều này đã giúp. Vì một số lý do, tôi không thể làm cho câu trả lời của @cletus hoạt động nhưng điều này đã làm. Không chắc chắn bí ẩn lớn về jQuery là gì nhưng mã đơn giản không phải lúc nào cũng hoạt động như bạn mong đợi.
AturSams

38

Nếu bạn sử dụng Fire Fox, chỉ cần mở giao diện điều khiển (sử dụng phím F12) và thử điều này:

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);
});

hy vọng nó giúp


17

Đối với bất kỳ ai khác bị mắc kẹt với điều này, có lẽ nó không hoạt động vì cuộc gọi ajax đang diễn giải dữ liệu trả về của bạn dưới dạng văn bản - tức là nó chưa phải là một đối tượng JSON.

Bạn có thể chuyển đổi nó thành một đối tượng JSON bằng cách sử dụng thủ công lệnh parseJSON hoặc chỉ cần thêm thuộc tính dataType: 'json' vào cuộc gọi ajax của bạn. ví dụ

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");
    }
});

Điều này mang lại cho tôi "dữ liệu không xác định".
Hugh Seagraves

Bạn nên sử dụng biến của riêng bạn để lưu trữ dữ liệu bạn đang chuyển đến url. Nếu biến dữ liệu của bạn được gọi là mydata thì hãy sử dụng dữ liệu: mydata
Dave Hilditch

Ah. Giờ đã hiểu. Cảm ơn.
Hugh Seagraves

Uncaught TypeError: Cannot use 'in' operator to search for '188' innhận được lỗi đó.
Si8 17/03/2017

15

Truy cập mảng json giống như bất kỳ mảng nào khác.

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

1
câu hỏi cũ, nhưng làm thế nào bạn có thể lặp qua các khóa json mà không biết tên ... như Test1, Test2, ext ...
BarclayVision

@BarclayVision Bạn chỉ cần sử dụng khóa làm số. Chìa khóa đầu tiên là [0], tiếp theo [1], v.v.
copilot0910

chúng ta có thể sử dụng một cuộc gọi ajax khác trong vòng lặp này không? Nếu có thì xin vui lòng cho tôi biết làm thế nào?
Jyoti Jadhav

5

Đây là những gì tôi nghĩ ra để dễ dàng xem tất cả các giá trị dữ liệu:

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


4

Hãy thử chức năng jQuery.map , hoạt động khá tốt với bản đồ.

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

Nếu bạn không muốn cảnh báo, đó là bạn muốn html, thì hãy làm điều này

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

LƯU Ý: sử dụng "chắp thêm" chứ không phải "html" nếu không kết quả cuối cùng là những gì bạn sẽ thấy trên chế độ xem html của mình

thì mã html của bạn sẽ trông như thế này

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

Bạn cũng có thể tạo kiểu (thêm lớp) div trong jquery trước khi nó hiển thị dưới dạng html


0

Nếu bạn đang sử dụng phương thức ngắn của hàm gọi JQuery ajax như dưới đây, dữ liệu được trả về cần được hiểu là một đối tượng json để bạn có thể lặp qua.

$.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

Tôi là một phần của hàm mũi tên ES2015 để tìm giá trị trong một mảng

const result = data.find(x=> x.TEST1 === '46');

Thanh toán Array.prototype.find () TẠI ĐÂY


0

$eachsẽ hoạt động .. Một tùy chọn khác là jQuery Ajax Callback cho kết quả mảng

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

Tôi sử dụng .map cho foreach. Ví dụ

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>`)
  })
},
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.