2009-04-09 27 views
132

En la devolución de llamada con éxito de jQuery AJAX, deseo recorrer los resultados del objeto. Este es un ejemplo de cómo se ve la respuesta en Firebug.jQuery loop sobre el resultado JSON de AJAX Success?

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

¿Cómo puedo recorrer los resultados para tener acceso a cada uno de los elementos? He intentado algo como a continuación, pero parece que no funciona.

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

Esto debería trabajo. ¿Estás seguro de que es exactamente el mismo código y la misma información? –

Respuesta

212

puede quitar el lazo externo y reemplazar this con data.data:

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

estaban cerca:

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

tiene una matriz de objetos/Maps para las bucle externo Sobre esos. El ciclo interno itera sobre las propiedades de cada elemento de objeto.

+2

¿Por qué doble bucle? – Asaf

+0

El primer bucle es para una "categoría", mientras que un bucle dentro de eso es para un "atributo". ¿De qué otra manera se hace eso? – dcolumbus

+0

¿Qué sucede si desea trabajar con el elemento objeto en lugar de sus propiedades? ¿Por qué no funciona el ciclo de @ aherrick en la pregunta? – StuperUser

12

Acceda a la matriz json como lo haría con cualquier otra matriz.

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

pregunta anterior, pero ¿cómo se puede recorrer las teclas json sin conocer los nombres ... como Test1, Test2, ext ... – BarclayVision

+0

@BarclayVision Simplemente usa la tecla como número. La primera clave es '[0]', la siguiente '[1]', y así sucesivamente. – copilot0910

36

Si utiliza Fire Fox, basta con abrir una consola (uso tecla F12) y probar esto:

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

creo que sirve

74

También puede utilizar la función getJSON:

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

Esto es solo una nueva redacción de la respuesta de ifesdjeen, pero pensé que podría ser b e útil para las personas.

+0

Esto ayudó. Por alguna razón, no pude obtener la respuesta de @cletus para que funcione, pero esto fue así. No estoy seguro de cuál es el gran misterio acerca de jQuery, pero el código simple no siempre funciona como esperabas. – zehelvion

0

$each va a funcionar .. Otra opción es 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

Trate jQuery.map función, funciona bastante bien con los mapas.

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

Para cualquier otra persona pegado con esto, es probable que no está funcionando debido a que la llamada AJAX es la interpretación de los datos devueltos en forma de texto - es decir, no está todavía un objeto JSON.

Puede convertirlo en un objeto JSON utilizando manualmente el comando parseJSON o simplemente agregando la propiedad dataType: 'json' a su llamada ajax. p.ej.

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

Esto me está dando "datos no definidos". –

+0

Debe usar su propia variable que almacena los datos que está pasando a la url. Si su variable de datos se llama mydata, entonces use datos: mydata –

+0

Ah. Ya lo pillo. Gracias. –

2

También puede utilizar la función getJSON:

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

¿Por qué esta no es una respuesta popular? Utiliza un solo bucle y hace el truco muy bien. La respuesta aceptada hace un doble foreach sin un significado claro para el primer foreach. –

+0

undefined es la salida para mí – clarifier

2

Esto es lo que se me ocurrió para ver fácilmente todos los valores de datos:

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

+0

¡Realmente esta funciona perfectamente! – jsanchezs

Cuestiones relacionadas