jquery - log - ¿Cómo se puede evitar que Chrome y Opera clasifiquen objetos JSON por Index ASC?
difference between console log and console dir (16)
A menos que ese JSON sea una matriz, en lugar de un objeto, no hay un estándar que diga que tiene que estar en cierto orden. Sin embargo, esto no debería ser un problema ya que no necesita recorrer el objeto para obtener los datos, simplemente puede consultar la propiedad.
Tengo un problema.
Usando ajax envié un objeto JSON correctamente formado usando:
$.ajax({
type: "POST",
url: SITE_URL+''/data.php'',
dataType: "json",
data: { ajax: 1 },
success: function(data) {
console.log(data);
}
});
Sin embargo, Opera y Chrome, aunque reciben el mismo objeto, imprimen el objeto en un orden incorrecto, parece que ambos realizan una clasificación por número de identificación en lugar de simplemente dejarlo en blanco.
¿Hay alguna manera de detener esta ordenación automática?
Editar, después de descubrir que es un ordenamiento por número de índice, creo que el mejor método podría ser no usar el índice para almacenar el object_id y, en su lugar, almacenar el número de identificación para el que deseo ordenar el objeto.
Sin embargo, me gustaría saber si hay alguna manera de detener el tipo.
Gracias
Edit2, solo me gustaría notar que voy a trabajar en una forma diferente de hacer esto, ya que siento que estoy abusando de los objetos con este método. Sin embargo, aún me gustaría entender por qué Opera y Chrome consideran que es su derecho cambiar el orden de mis ID de objetos:
El problema sería tratar de ahorrar energía de procesamiento, digamos que tenemos personas con una ID,
1.John, 2.Frank y 3.Sally. Sin embargo, cada una de estas personas tiene un alto conjunto de propiedades (y otras cosas). 1.John.180, 2.Frank.220, 3.Sally.150. Para ahorrar en el procesamiento, solicito el resultado de que las personas se clasifiquen por su altura, así que obtengo una matriz de 2, 1, 3 con sus otras propiedades. I JSON esta matriz y enviarla al navegador.
Ahora que FF mantendrá el nuevo orden, People [1] seguirá siendo John, pero en un bucle For n as person estará fuera de servicio.
Si no puedo evitar esto, simplemente no tendré que molestarme en clasificar la etapa SQL y agregar bucles y ordenaciones adicionales en una matriz en el escenario JS, aunque quería evitar más estrés en el navegador porque ya es un pesado Js. página.
Muchas gracias
Algunos buscadores clasifican claves que son int, por otro lado, es muy fácil cambiar eso a string y luego revertir, la solución de la mina era agregar "i" a la clave, eso hizo un truco. Funciona perfectamente para cada navegador :) Espero que ayude :)
Cambiar el número entero a la cadena no funcionó para mí (Chrome, jQuery 1.7.1). Entonces, para mantener el orden (sí, es un abuso de objetos), cambié esto:
optionValues0 = {"4321": "option 1", "1234": "option 2"};
a esto
optionValues0 = {"1": {id: "4321", value: "option 1"}, "2": {id: "1234", value: "option 2"}};
Cuando pase el objeto de datos a console.log
, JavaScript terminará llamando al método toString()
para el objeto de datos. Como no le gusta el formato predeterminado del método toString()
de los datos, tendrá que hacer el trabajo usted mismo.
Puede volcar los campos del objeto usted mismo si quiere ese tipo de control: debería obtener las claves / campos y ordenarlos y luego crear la versión de cadena usted mismo.
algo como:
for (field in obj)
add field to array
sort array into whatever order you want
for (field in array)
get value of field from obj
create string of field : value, append to main string
console.log(main string)
Debes engañar a Google Chrome (y a otros) para que crean que tienes una cadena y no un número. Cambiar el JSON a {"2423":''abc'', "2555":''xyz''}
no funcionará.
Tuve que usar "_2423" y "_2555" como índices en mi objeto para que funcione.
Además, la depuración de la salida a console.log o el uso for x in y
dio resultados diferentes para _.each
método (ver el marco de subrayado).
Puede ver mi prueba / prueba en JSFiddle con "_"
frente a ningún prefijo y el ciclo for x in y
: http://jsfiddle.net/3f9jugtg/1/
Haga su identificador de objeto en el parámetro de cadena JSON, funciona sin clasificación automática.
Hay algunos casos en los que necesitará usar la identificación de registro para agrupar elementos en un bucle de proceso posterior. Poner comillas alrededor del valor clave funcionará. O puede usar array_merge en la matriz final que restablece las claves.
$processed_array = array(
235=>array("id"=>235,"name"=>"Something"),
27=>array("id"=>27,"name"=>"Something")
);
array_merge($processed_array);
Un print_r ($ processed_array); ahora devuelve lo siguiente:
$processed_array = array(
0=>array("id"=>235,"name"=>"Something"),
1=>array("id"=>27,"name"=>"Something")
);
Los diferentes navegadores manejan objetos de diferentes maneras, mi error fue intentar usar el orden en que construí un objeto como referencia donde no debería.
Ninguna de las soluciones funcionó para mí (agosto de 2017). Incluso si utilicé una cadena, Chrome y Safari (no probaron otros navegadores) seguían ordenando en función de la cadena. Lo que hice en cambio fue concatenar mi clave entera con cadena de valor. p.ej
result[string_value + str(integer_key)] = string_value
De esta forma, la cadena es la primera y el navegador es libre de ordenar. Luego usé una lógica simple para separar la clave del valor.
Espero que esto ayude.
Parece que la mejor manera es evitar las matrices asociativas. Cuando desee enviar una matriz asociada, simplemente envíela como dos matrices separadas: una de claves y otra de valores. Aquí está el código PHP para hacer eso:
$arWrapper = array();
$arWrapper[''k''] = array_keys($arChoices);
$arWrapper[''v''] = array_values($arChoices);
$json = json_encode($arWrapper);
y el código JavaScript simple para hacer lo que quieras con él
for (i=0; i < data[''k''].length; i++) {
console.log(''key:'' + data[''k''][i] + '' val:'' + data[''v''][i]);
}
Tuve un problema similar y lo publiqué en jQuery: $ .getJSON clasificando los datos en Chrome / IE?
Resolví este problema usando este código:
$(''.edit_district'').editable("/moderator/sale/edit_sale/", {
data : " {''_7'':''10 street'', ''_9'':''9 street'', ''_11'':''park''}",
type : ''select'',
submit : ''OK'',
onblur : ''submit''
});
y en script.php:
...
case "id_district":
$district = Districts::GetDistrictByID(Database::getInstance(), (int)substr($value,1));
if($district instanceof District){
$data["id_district"] = $district->id_district;
echo $district->title;
}
break;
...
Tenía el mismo problema, siguió la solución de dmc pero acaba de agregar un espacio delante del valor int para convertirlo en una cadena.
La ventaja de utilizar un espacio en lugar de otro carácter no numérico es que el valor POSTed posterior se puede utilizar directamente en una cláusula de búsqueda mySQL sin tener que eliminarlo de nuevo.
Tuve el mismo "problema" y no quería volver atrás y cambiar demasiado en el código. Entendí que al menos Google Chrome solo reordena los índices numéricos. Siempre que el índice se considere una cadena, aparecerá en el orden "previsto". ¿Alguien podría verificar esto en Opera?
Tuve el mismo problema con Chrome, tan frustrante. Lo envío de cierta manera, ¿por qué no puede Chrome aceptar mi palabra al respecto? Entiendo que no hay una forma "estándar", pero si ese es el caso, ¿por qué imponer tu propio orden?
De todos modos, lo manejé convirtiendo mis objetos en matrices, para que
{ 0: "", 2: "Frame", 1: "Masonry" }
convirtió
[[ 0, "" ], [ 2, "Frame" ], [ 1, "Masonry" ]]
Tuve que cambiar algunos javascript, pero terminó funcionando perfectamente.
Tuve el mismo problema y me tomó un tiempo averiguar qué fue lo que causó, qué dolor. Terminé eliminando ID del índice y usé array_push, en lugar de ser:
$section[$s_id][''Type''] = $booktype;
etc. Lo cambié a
array_push($sections, array(''ID''=>$s_id,
''CourseID''=>$courseid,
''SectionName''=>$secname,
''Order''=>$order,
''Created''=>$created,
''Description''=>$desc
));
Lo que me permitió mantener el orden de PHP ya que los nuevos índices ya estaban en orden (0,1,2,3, etc. en lugar de 112, 56, 411, etc.)
Un truco que puede ayudar es el siguiente:
Tienes que agregar "i" a la tecla mientras preparas tus datos para el ciclo, eso creó un truco. Funciona perfectamente para cada navegador.
por ejemplo :
for(var i=1;i<4;i++){
data[''''+i+''''+your_random_generatedId+''''] = {"questionText":"","answer":"","options":"",noOfOptions:""};
console.log(data[''''+i+''''+your_random_generatedId+'''']); // This prints the log of each object inside data
}
console.log(data); // This will print the Object without sorting
Por lo tanto, su Objeto será el siguiente:
Object {156674: Object, 201705: Object, 329709: Object}
espero que esto ayude :)