Pętla jQuery na wyniku JSON z sukcesu AJAX?


152

W wywołaniu zwrotnym sukcesu jQuery AJAX chcę zapętlić wyniki obiektu. To jest przykład tego, jak wygląda odpowiedź w Firebug.

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

Jak mogę zapętlić wyniki, aby mieć dostęp do każdego z elementów? Próbowałem czegoś takiego jak poniżej, ale to nie działa.

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

1
To powinno działać. Czy na pewno to dokładnie ten sam kod i te same dane?
Tamas Czinege

Odpowiedzi:


255

możesz zdjąć zewnętrzną pętlę i zastąpić thisdata.data:

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

Byłeś blisko:

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

Masz tablicę obiektów / map, więc zewnętrzna pętla przechodzi nad nimi. Pętla wewnętrzna wykonuje iterację po właściwościach każdego elementu obiektu.


Pierwsza pętla jest dla „kategorii”, a pętla wewnątrz niej jest dla „atrybutu”. Jak inaczej to się robi?
dcolumbus

A co, jeśli chcesz pracować z elementem obiektu, a nie z jego właściwościami? Dlaczego pętla @ aherrick w pytaniu nie działa?
StuperUser

1
Jeśli ta pętla jest używana w osobnym użyciu funkcji $(data)zamiast data, w przeciwnym razie zmienna kzawsze zwraca 0.
user1226868

2
Czy ktoś mógłby wyjaśnić zmienne k & v, które są przekazywane do drugiej funkcji?
Brent Connor

@BrentConnor w tym przypadku k & v reprezentuje klucz i wartość tablicy, która jest cyklicznie przechodząca. Przeczytaj więcej o funkcji jquery .each ()
Ghost Echo,

80

Możesz także użyć funkcji getJSON :

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

To naprawdę jest tylko przeformułowanie odpowiedzi ifesdjeen, ale pomyślałem, że może to być pomocne dla ludzi.


To pomogło. Z jakiegoś powodu nie mogłem uzyskać odpowiedzi @cletus, ale tak się stało. Nie jestem pewien, na czym polega wielka tajemnica w jQuery, ale prosty kod nie zawsze działa tak, jak tego oczekujesz.
AturSams,

38

Jeśli używasz Fire Fox, po prostu otwórz konsolę (użyj klawisza F12) i wypróbuj to:

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

mam nadzieję, że to pomoże


17

Dla każdego, kto utknął z tym, prawdopodobnie nie działa, ponieważ wywołanie AJAX interpretuje zwrócone dane jako tekst - tj. Nie jest to jeszcze obiekt JSON.

Możesz przekonwertować go na obiekt JSON, ręcznie używając polecenia parseJSON lub po prostu dodając właściwość dataType: 'json' do wywołania ajax. na przykład

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

To daje mi informację „dane są nieokreślone”.
Hugh Seagraves

Powinieneś użyć własnej zmiennej, która przechowuje dane, które przekazujesz do adresu URL. Jeśli twoja zmienna danych nazywa się mydata, użyj data: mydata
Dave

Ach. Teraz to rozumiem. Dzięki.
Hugh Seagraves

Uncaught TypeError: Cannot use 'in' operator to search for '188' inotrzymuję ten błąd.
Si8

15

Uzyskaj dostęp do tablicy json tak, jak do każdej innej tablicy.

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

1
stare pytanie, ale jak można zapętlić klucze json bez znajomości nazw ... takich jak Test1, Test2, ext ...
BarclayVision

@BarclayVision Po prostu używasz klucza jako liczby. Pierwszy klucz [0], następny [1]i tak dalej.
copilot0910

czy możemy użyć innego wywołania ajax wewnątrz tej pętli for? Jeśli tak, to powiedz mi jak?
Jyoti Jadhav

5

Oto, co wymyśliłem, aby łatwo wyświetlić wszystkie wartości danych:

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


4

Wypróbuj funkcję jQuery.map , działa całkiem dobrze z mapami.

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

jeśli nie chcesz alertów, czyli html, zrób to

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

UWAGA: użyj opcji „dołącz”, a nie „html”, w przeciwnym razie ostatni wynik będzie tym, co zobaczysz w widoku HTML

wtedy twój kod HTML powinien wyglądać tak

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

Możesz także stylizować (dodać klasę) element div w jquery, zanim zostanie wyrenderowany jako html


0

Jeśli korzystasz z krótkiej metody funkcji wywołania jQuery ajax, jak pokazano poniżej, zwrócone dane muszą być interpretowane jako obiekt json, abyś mógł przejść przez pętlę.

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

Jestem stronniczy w funkcji strzałki ES2015 do znajdowania wartości w tablicy

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

Checkout Array.prototype.find () TUTAJ


0

$eachzadziała .. Inną opcją jest wywołanie zwrotne jQuery Ajax dla wyniku tablicy

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

Używam .map dla foreach. Na przykład

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>`)
  })
},
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.