2009-04-09 17 views
132

Sulla callback di successo jQuery AJAX, desidero eseguire il loop dei risultati dell'oggetto. Questo è un esempio di come appare la risposta in Firebug.jQuery loop su JSON risultato di AJAX Success?

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

Come posso ciclo sui risultati in modo che avrei accesso a ciascuno degli elementi? Ho provato qualcosa come sotto ma questo non sembra funzionare.

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

Questo dovrebbe lavoro. Sei sicuro che sia esattamente lo stesso codice e gli stessi dati? –

risposta

212

è possibile rimuovere il ciclo esterno e sostituire this con data.data:

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

Eri vicino:

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

Hai un array di oggetti/mappe così i itera ciclo esterno su quelli. Il ciclo interno scorre le proprietà su ciascun elemento dell'oggetto.

+2

Perché doppio loop? – Asaf

+0

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

+0

Cosa succede se si desidera lavorare con l'elemento oggetto piuttosto che con le sue proprietà? Perché il ciclo @ aherrick nella domanda non funziona? – StuperUser

12

Accedere all'array json come se fosse un 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 scorrere le chiavi JSON senza conoscere i nomi ... come Test1, Test2, ext ... – BarclayVision

+0

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

36

Se si utilizza Fire Fox, basta aprire una console (tasto F12 uso) e provare 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); 
}); 

Speranza che aiuta

74

È anche possibile utilizzare la funzione getJSON:

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

Questo è in realtà solo una riformulazione della risposta di ifesdjeen, ma ho pensato che potrebbe b e utile alle persone.

+0

Questo ha aiutato. Per qualche motivo non ho potuto ottenere la risposta di @cletus al lavoro, ma così è stato. Non sei sicuro di quale sia il grande mistero di jQuery, ma il codice semplice non funziona sempre come te lo aspetti. – zehelvion

0

$each funzionerà .. Un'altra opzione è jQuery Ajax Callback for array result

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.'); 
    } 
    } 
3

Prova jQuery.map funzione, 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>

12

Per chiunque altro bloccato con questo, probabilmente non è lavorare perché la chiamata AJAX sta interpretando i dati restituiti come testo - vale a dire che non è ancora un oggetto JSON.

È possibile convertirlo in un oggetto JSON manualmente utilizzando il comando parseJSON o semplicemente aggiungendo la proprietà dataType: 'json' alla 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"); 
    } 
}); 
+0

Mi sta dando "i dati non sono definiti". –

+0

Dovresti usare la tua variabile che memorizza i dati che stai passando all'URL. Se la tua variabile di dati è chiamata mydata, utilizza i dati: mydata –

+0

Ah. Ho capito adesso. Grazie. –

2

È inoltre possibile utilizzare la funzione getJSON:

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

Perché questa non è una risposta popolare? Usa un singolo ciclo e fa il trucco molto bene. La risposta accettata fa un doppio errore senza un chiaro significato per la prima volta. –

+0

undefined è l'output per me – clarifier

2

Questo è quello che mi è venuta di visualizzare facilmente tutti i valori dei dati:

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

+0

In realtà questo funziona perfettamente! – jsanchezs

Problemi correlati