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.