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
});
aherrick
źródło
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.

cletus
źródło
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.

clone45
źródło
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

0100110010101
źródło
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");
    }
});
Dave Hilditch
źródło
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);
}
Toby Allen
źródło
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);

Yovav
źródło
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>

PanwarS87
źródło
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

The Dead Guy
źródło
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]);
      })
})
Frederick Eze
źródło
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

Leonardo Wildt
źródło
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.');
  }
}
LCJ
źródło
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>`)
  })
},
dimitar
źródło