jQuery loop over JSON risulta dal successo AJAX?


152

Sul callback di successo di jQuery AJAX voglio passare in rassegna i risultati dell'oggetto. Questo è un esempio di come appare la risposta in Firebug.

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

Come posso scorrere i risultati in modo da avere accesso a ciascuno degli elementi? Ho provato qualcosa di simile di seguito, ma questo non sembra funzionare.

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

1
Questo dovrebbe funzionare. Sei sicuro che sia esattamente lo stesso codice e gli stessi dati?
Tamas Czinege,

Risposte:


255

puoi rimuovere l'anello esterno e sostituirlo thiscon data.data:

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

Eri vicino:

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

Hai una serie di oggetti / mappe, quindi il ciclo esterno scorre su quelli. Il ciclo interno scorre le proprietà di ciascun elemento oggetto.


Il primo ciclo è per una "categoria" mentre un ciclo all'interno è per un "attributo". In quale altro modo viene fatto?
dcolumbus,

Cosa succede se si desidera lavorare con l'elemento object anziché con le sue proprietà? Perché il ciclo di @ aherrick nella domanda non funziona?
StuperUser

1
Se questo ciclo viene utilizzato in una funzione separata utilizzare $(data)invece di data, altrimenti la variabile krestituisce sempre 0.
user1226868

2
Qualcuno potrebbe spiegare le variabili k & v che vengono passate alla seconda funzione?
Brent Connor,

@BrentConnor in questo caso k & v rappresentano la chiave e il valore dell'array in fase di ciclo. Leggi la funzione jquery .each ()
Ghost Echo il

80

Puoi anche usare la funzione getJSON :

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

Questo è davvero solo una riformulazione della risposta di ifesdjeen, ma ho pensato che potesse essere utile alle persone.


Questo ha aiutato. Per qualche motivo non sono riuscito a ottenere la risposta di @cletus al lavoro, ma questo è successo. Non sono sicuro di quale sia il grande mistero di jQuery, ma il codice semplice non funziona sempre come previsto.
AturSams,

38

Se usi Fire Fox, apri una console (usa il tasto F12) e prova questo:

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

spero che sia d'aiuto


17

Per chiunque sia bloccato con questo, probabilmente non funziona perché la chiamata ajax sta interpretando i dati restituiti come testo, ovvero non è ancora un oggetto JSON.

Puoi convertirlo in un oggetto JSON usando manualmente il comando parseJSON o semplicemente aggiungendo la proprietà dataType: 'json' alla tua chiamata ajax. per esempio

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

Questo mi sta dando "i dati non sono definiti".
Hugh Seagraves,

Dovresti usare la tua variabile che memorizza i dati che stai passando all'URL. Se la tua variabile di dati si chiama mydata, utilizza i dati: mydata
Dave Hilditch

Ah. Ho capito adesso. Grazie.
Hugh Seagraves il

Uncaught TypeError: Cannot use 'in' operator to search for '188' inottenere quell'errore.
Si8

15

Accedi all'array json come faresti con qualsiasi altro array.

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

1
vecchia domanda, ma come è possibile passare in rassegna i tasti json senza conoscere i nomi ... come Test1, Test2, ext ...
BarclayVision

@BarclayVision Basta usare la chiave come numero. La prima chiave è [0], la successiva [1]e così via.
copilot0910,

possiamo usare un'altra chiamata ajax all'interno di questo per loop? Se sì allora per favore dimmi come?
Jyoti Jadhav,

5

Questo è quello che mi è venuto in mente per visualizzare facilmente tutti i valori dei dati:

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


4

Prova la funzione jQuery.map , funziona abbastanza bene con le mappe.

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

se non vuoi essere avvisato, allora vuoi HTML, quindi fai questo

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

NOTA: usa "append" non "html" altrimenti l'ultimo risultato è quello che vedrai nella tua vista html

allora il tuo codice html dovrebbe assomigliare a questo

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

Puoi anche assegnare uno stile (aggiungi classe) al div nel jquery prima che venga visualizzato come html


0

Se si utilizza il metodo breve della funzione di chiamata ajax di JQuery come mostrato di seguito, i dati restituiti devono essere interpretati come un oggetto json per poter essere sottoposti a loop.

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

Sono parziale alla funzione freccia ES2015 per trovare valori in un array

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

Acquista Array.prototype.find () QUI


0

$eachfunzionerà .. Un'altra opzione è jQuery Ajax Callback per il risultato dell'array

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

Uso .map per foreach. Per esempio

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>`)
  })
},
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.