Comment arrêtez-vous les objects JSON sortingés par Chrome et Opera par Index ASC?

J’ai un problème.

En utilisant ajax j’ai envoyé un object JSON correctement formé en utilisant:

$.ajax({ type: "POST", url: SITE_URL+'/data.php', dataType: "json", data: { ajax: 1 }, success: function(data) { console.log(data); } }); 

Cependant, Opera et Chrome, bien que recevant le même object, impriment l’object dans un ordre incorrect, il semble qu’ils effectuent tous deux un sorting par numéro d’ID au lieu de le laisser tout seul!

Est-il possible d’arrêter ce sorting automatique?

Edit, après avoir découvert qu’il s’agit d’un sorting par numéro d’index, je pense que la meilleure méthode pourrait être de ne pas utiliser l’index pour stocker object_id et de stocker le numéro d’identification que je veux classer.

Cependant, je voudrais quand même savoir s’il existe un moyen d’arrêter le sorting.

Je vous remercie

Edit2, je voudrais juste noter que je vais travailler sur une manière différente, car j’ai l’impression d’abuser des objects avec cette méthode. Cependant, je voudrais toujours comprendre pourquoi Opera et Chrome ont le droit de modifier l’ordre de mes identifiants d’objects:

Le problème serait que je tente d’économiser de la puissance de traitement, disons que nous avons des personnes avec un identifiant,

1.John, 2.Frank et 3.Sally. Cependant, chacune de ces personnes possède un ensemble de propriétés (et d’autres choses). 1.John.180, 2.Frank.220, 3.Sally.150. Pour économiser sur le traitement, je demande que le résultat des personnes soit sortingé en fonction de leur taille, donc j’obtiens un tableau de 2, 1, 3 avec leurs autres propriétés. Je JSON ce tableau et l’envoyer au navigateur.

Maintenant, FF conservera le nouvel ordre. Les personnes [1] seraient toujours John mais dans une boucle For n en tant que personne, elles seront hors service.

Si je ne peux pas contourner ce problème, je n’aurai pas à me soucier du sorting à l’étape SQL et à append des boucles et des sorting supplémentaires dans un tableau de l’étape JS, bien que je souhaite éviter le stress du navigateur. page.

Merci beaucoup

Avait le même problème, suivait la solution de dmc mais ajoutait juste un espace devant la valeur int pour en faire une chaîne.

L’avantage d’utiliser un espace plutôt qu’un autre caractère non numérique est que la valeur POSTed ultérieure peut être utilisée directement dans une clause de recherche mySQL sans avoir à la supprimer à nouveau.

Différents navigateurs gèrent les objects de différentes manières, ma faute étant d’essayer d’utiliser l’ordre dans lequel j’ai construit un object comme référence là où je ne devrais pas.

Changer l’entier en chaîne ne fonctionnait pas pour moi (Chrome, jQuery 1.7.1). Donc, pour garder la commande (oui, c’est un object abusant), j’ai changé ceci:

 optionValues0 = {"4321": "option 1", "1234": "option 2"}; 

pour ça

 optionValues0 = {"1": {id: "4321", value: "option 1"}, "2": {id: "1234", value: "option 2"}}; 

A moins que JSON ne soit un tableau, plutôt qu’un object, il n’y a pas de norme indiquant qu’il doit être dans un certain ordre. Cependant, cela ne devrait pas être un problème puisque vous n’avez pas besoin de parcourir l’object pour obtenir les données, vous pouvez simplement faire référence à la propriété.

Certains navigateurs vont sortinger les clés qui sont int, par contre il est très facile de changer cela en chaîne et de revenir plus tard, la solution de la mine a été d’append “i” à la clé, qui a fait un tour. Fonctionne parfaitement pour chaque navigateur 🙂 J’espère que ça aide 🙂

J’ai eu le même “problème” et je ne voulais pas revenir en arrière et changer trop dans le code. J’ai constaté qu’au moins Google Chrome ne recalcule que les index numériques. Tant que l’index est considéré comme une chaîne, il apparaîtra dans l’ordre prévu. Quelqu’un pourrait-il s’il vous plaît vérifier ceci sur Opera?

Aucune des solutions n’a fonctionné pour moi (août 2017). Même si j’utilisais une chaîne de caractères Chrome et Safari (je n’ai pas testé d’autres navigateurs), le sorting était toujours basé sur la chaîne. Ce que j’ai fait à la place était de concaténer ma clé entière avec une chaîne de valeur. par exemple

 result[ssortingng_value + str(integer_key)] = ssortingng_value 

De cette façon, la chaîne est la première et le navigateur est libre de sortinger. Ensuite, j’ai utilisé une logique simple pour séparer la clé de la valeur.

J’espère que cela t’aides.

Il semble que le meilleur moyen consiste à éviter les tableaux associatifs. Lorsque vous voulez envoyer un tableau associé, envoyez-le simplement comme deux tableaux distincts: l’un des clés et l’autre des valeurs. Voici le code PHP pour faire cela:

  $arWrapper = array(); $arWrapper['k'] = array_keys($arChoices); $arWrapper['v'] = array_values($arChoices); $json = json_encode($arWrapper); 

et le code JavaScript simple pour faire ce que vous voulez avec elle

  for (i=0; i < data['k'].length; i++) { console.log('key:' + data['k'][i] + ' val:' + data['v'][i]); } 

J'ai eu un problème similaire et publié sur jQuery: $ .getJSON sortingant les données sur Chrome / IE?

J’ai résolu ce problème en utilisant ce code:

 $('.edit_dissortingct').editable("/moderator/sale/edit_sale/", { data : " {'_7':'10 street', '_9':'9 street', '_11':'park'}", type : 'select', submit : 'OK', onblur : 'submit' }); 

et dans script.php:

 ... case "id_dissortingct": $dissortingct = Dissortingcts::GetDissortingctByID(Database::getInstance(), (int)substr($value,1)); if($dissortingct instanceof Dissortingct){ $data["id_dissortingct"] = $dissortingct->id_dissortingct; echo $dissortingct->title; } break; ... 

Vous devez tromper Google Chrome (et les autres) en leur faisant croire que vous avez une chaîne et non un numéro. Changer le JSON à {"2423":'abc', "2555":'xyz'} ne fonctionnera pas.

J’ai dû utiliser “_2423” et “_2555” comme index dans mon object pour le faire fonctionner.

De plus, le débogage de la sortie dans console.log ou l’utilisation de for x in y donné des résultats différents de _.each méthode _.each (voir le cadre de soulignement).

Vous pouvez voir mon test / preuve dans JSFiddle avec "_" vs pas de préfixe et le for x in y boucle for x in y : http://jsfiddle.net/3f9jugtg/1/

Faites votre identifiant d’object dans le paramètre de chaîne JSON, cela fonctionne sans sorting automatique.

Dans certains cas, vous devrez utiliser l’ID d’enregistrement pour regrouper des éléments dans une boucle de post-traitement. Mettre des guillemets autour de la valeur clé fonctionnera. Ou vous pouvez utiliser array_merge sur le tableau final qui réinitialise les clés.

 $processed_array = array( 235=>array("id"=>235,"name"=>"Something"), 27=>array("id"=>27,"name"=>"Something") ); array_merge($processed_array); 

Un print_r ($ transform_array); renvoie maintenant les éléments suivants:

 $processed_array = array( 0=>array("id"=>235,"name"=>"Something"), 1=>array("id"=>27,"name"=>"Something") ); 

J’ai eu le même problème et il m’a fallu du temps pour déterminer ce qui en était la cause, quelle douleur. J’ai fini par supprimer l’ID de l’index et utilisé array_push, au lieu d’être:

 $section[$s_id]['Type'] = $booktype; 

etc. je l’ai changé pour

 array_push($sections, array('ID'=>$s_id, 'CourseID'=>$courseid, 'SectionName'=>$secname, 'Order'=>$order, 'Created'=>$created, 'Description'=>$desc )); 

Ce qui m’a permis de conserver la commande depuis PHP depuis les nouveaux index déjà en place (0,1,2,3 etc. contre 112, 56, 411 etc.)

J’ai eu le même problème avec le chrome, tellement frustrant. Je l’envoie d’une certaine manière, pourquoi le chrome ne peut-il pas me croire? Je comprends qu’il n’y a pas de méthode “standard”, mais si c’est le cas, pourquoi imposer votre propre commande?

Quoi qu’il en soit, je l’ai traité en transformant mes objects en tableaux, de sorte que

 { 0: "", 2: "Frame", 1: "Masonry" } 

devenu

 [[ 0, "" ], [ 2, "Frame" ], [ 1, "Masonry" ]] 

J’ai dû changer du javascript, mais cela a fini par fonctionner parfaitement.

Un truc qui peut aider est comme suit:

Vous devez append “i” à la clé pendant que vous préparez vos données pour la boucle, cela a fait un tour. Fonctionne parfaitement pour chaque navigateur.

par exemple :

  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 

Par conséquent, votre object sera comme suit:

 Object {156674: Object, 201705: Object, 329709: Object} 

J'espère que cela t'aides 🙂

Lorsque vous transmettez l’object de données à console.log , JavaScript finira par appeler la toSsortingng() pour l’object de données. Comme vous n’aimez pas le format par défaut de la toSsortingng() de data, vous devrez faire le travail vous-même.

Vous pouvez vider les champs de l’object vous-même si vous voulez ce type de contrôle – vous devrez récupérer les clés / champs et les sortinger, puis créer vous-même la version de chaîne.

quelque chose comme:

 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 ssortingng of field : value, append to main ssortingng console.log(main ssortingng)