recorrer parse mostrar ejemplo datos array javascript arrays json stringify

parse - Convierta el objeto o la matriz javascript en json para datos ajax



recorrer json javascript (2)

Así que estoy creando una matriz con información de elementos. Recorro todos los elementos y guardo el índice. ¡Por algún motivo, no puedo convertir esta matriz en un objeto json!

Este es mi loop array:

var display = Array(); $(''.thread_child'').each(function(index, value){ display[index]="none"; if($(this).is(":visible")){ display[index]="block"; } });

Intento convertirlo en un objeto JSON por:

data = JSON.stringify(display);

¡No parece enviar el formato JSON correcto!

Si le doy el código de esta manera, funciona y envía información:

data = {"0":"none","1":"block","2":"none","3":"block","4":"block","5":"block","6":"block","7":"block","8":"block","9":"block","10":"block","11":"block","12":"block","13":"block","14":"block","15":"block","16":"block","17":"block","18":"block","19":"block"};

Cuando hago una alerta en el objeto JSON.stringify, se ve igual que el codificado a mano. Pero no funciona.

Me estoy volviendo loco tratando de resolver esto! ¿Que me estoy perdiendo aqui? ¿Cuál es la mejor manera de enviar esta información para obtener el formato codificado a mano?

Estoy usando este método ajax para enviar datos:

$.ajax({ dataType: "json", data:data, url: "myfile.php", cache: false, method: ''GET'', success: function(rsp) { alert(JSON.stringify(rsp)); var Content = rsp; var Template = render(''tsk_lst''); var HTML = Template({ Content : Content }); $( "#task_lists" ).html( HTML ); } });

Usando el método GET porque estoy mostrando información (no actualizando o insertando). Solo enviando información de visualización a mi archivo php.

SOLUCIÓN FINAL

var display = {}; $(''.thread_child'').each(function(index, value){ display[index]="none"; if($(this).is(":visible")){ display[index]="block"; } }); $.ajax({ dataType: "json", data: display, url: "myfile.php", cache: false, method: ''GET'', success: function(rsp) { alert(JSON.stringify(rsp)); var Content = rsp; var Template = render(''tsk_lst''); var HTML = Template({ Content : Content }); $( "#task_lists" ).html( HTML ); } });


No estoy del todo seguro, pero creo que probablemente te sorprendas de cómo las matrices se serializan en JSON. Vamos a aislar el problema. Considera seguir el código:

var display = Array(); display[0] = "none"; display[1] = "block"; display[2] = "none"; console.log( JSON.stringify(display) );

Esto se imprimirá:

["none","block","none"]

Así es como JSON realmente serializa la matriz. Sin embargo, lo que quieres ver es algo como:

{"0":"none","1":"block","2":"none"}

Para obtener este formato, desea serializar el objeto, no la matriz. Así que reescribamos el código anterior así:

var display2 = {}; display2["0"] = "none"; display2["1"] = "block"; display2["2"] = "none"; console.log( JSON.stringify(display2) );

Esto se imprimirá en el formato que desee.

Puedes jugar con esto aquí: http://jsbin.com/oDuhINAG/1/edit?js,console


Puede usar JSON.stringify(object) con un objeto y acabo de escribir una función que convertirá recursivamente una matriz en un objeto, como este JSON.stringify(convArrToObj(array)) , que es el siguiente código (más detalles puede se encuentra en esta respuesta ):

// Convert array to object var convArrToObj = function(array){ var thisEleObj = new Object(); if(typeof array == "object"){ for(var i in array){ var thisEle = convArrToObj(array[i]); thisEleObj[i] = thisEle; } }else { thisEleObj = array; } return thisEleObj; }

Para que sea más genérico, puede anular la función JSON.stringify y no tendrá que preocuparse de nuevo, para hacerlo, simplemente pegue esto en la parte superior de la página:

// Modify JSON.stringify to allow recursive and single-level arrays (function(){ // Convert array to object var convArrToObj = function(array){ var thisEleObj = new Object(); if(typeof array == "object"){ for(var i in array){ var thisEle = convArrToObj(array[i]); thisEleObj[i] = thisEle; } }else { thisEleObj = array; } return thisEleObj; }; var oldJSONStringify = JSON.stringify; JSON.stringify = function(input){ return oldJSONStringify(convArrToObj(input)); }; })();

¡Y ahora JSON.stringify aceptará arrays u objects ! ( enlace a jsFiddle con el ejemplo )

Editar:

Aquí hay otra versión que es un poco más eficiente, aunque puede o no ser menos confiable (no estoy seguro, depende de si JSON.stringify(array) siempre devuelve [] , lo que no veo mucho por qué no lo haría ''t, así que esta función debería ser mejor, ya que hace un poco menos de trabajo cuando usas JSON.stringify con un object ):

(function(){ // Convert array to object var convArrToObj = function(array){ var thisEleObj = new Object(); if(typeof array == "object"){ for(var i in array){ var thisEle = convArrToObj(array[i]); thisEleObj[i] = thisEle; } }else { thisEleObj = array; } return thisEleObj; }; var oldJSONStringify = JSON.stringify; JSON.stringify = function(input){ if(oldJSONStringify(input) == ''[]'') return oldJSONStringify(convArrToObj(input)); else return oldJSONStringify(input); }; })();

jsEn línea con el ejemplo aquí

js Prueba de rendimiento aquí, a través de jsPerf