JQuery цикл по JSON результат AJAX Успех?


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
Это должно работать. Вы уверены, что это точно такой же код и те же данные?
Тамас Чинеге

Ответы:


255

Вы можете удалить внешний цикл и заменить thisна data.data:

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

Вы были близки

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

У вас есть массив объектов / карт, поэтому внешний цикл выполняет итерации по ним. Внутренний цикл перебирает свойства каждого элемента объекта.


Первый цикл предназначен для «категории», а цикл внутри него - для «атрибута». Как еще это сделать?
dcolumbus

Что если вы хотите работать с элементом объекта, а не с его свойствами? Почему не работает цикл @ aherrick в вопросе?
StuperUser

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.

Вы можете преобразовать его в объект JSON, вручную используя команду parseJSON или просто добавив свойство dataType: 'json' к вашему вызову ajax. например

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
Дейв

Ах. Понял сейчас. Спасибо.
Хью Сигрейвс

Uncaught TypeError: Cannot use 'in' operator to search for '188' inполучить эту ошибку.
Si8

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

@ BarclayVision Вы просто используете ключ в качестве числа. Первый ключ [0], следующий [1]и так далее.
copilot0910

мы можем использовать другой вызов ajax внутри цикла for? Если да, то скажите, пожалуйста, как?
Джиоти Джадхав

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

Вы также можете стилизовать (добавить класс) div в jquery, прежде чем он отобразится как html


0

Если вы используете короткий метод функции вызова jjuery ajax, как показано ниже, возвращаемые данные должны быть интерпретированы как объект 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

Я неравнодушен к функции стрелки ES2015 для поиска значений в массиве

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

Оформить заказ Array.prototype.find () ЗДЕСЬ


0

$eachбудет работать .. Другой вариант - JQuery Ajax Callback для результата массива

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 для 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>`)
  })
},
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.