如何阻止索引ASC的Chrome和OperasortingJSON对象?

我有一个问题。

使用ajax我发送一个正确的JSON对象使用:

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

然而,Opera和Chrome虽然接收到相同的对象,但是按照不正确的顺序打印出对象,似乎他们都是按照ID号sorting,而不是单单放在一边!

有没有办法阻止这种自动sorting?

编辑后,发现它是一个按索引号sorting我在想最好的方法可能是不使用索引来存储object_id,而是存储我想命令对象的id号。

不过,我仍然想知道是否有办法阻止这种sorting。

谢谢

编辑2,我只是想说明,我将以不同的方式来做这件事,因为我觉得我用这种方法滥用对象。 不过,我仍然想明白为什么Opera和Chrome觉得这是他们改变我的对象ID的顺序的权利:

问题是我试图节省处理能力,可以说我们有一个身份证的人,

约翰,2.Frank和3.Sally。 然而,这些人中的每一个都有一个很高的属性集(和其他东西)。 约翰180,2.弗兰克220,3.萨利150。 为了节省处理,我要求人们的高度sorting的结果,所以我得到一个2,1和3与他们的其他属性的数组。 我JSON这个数组,并将其发送到浏览器。

现在FF会保持新的顺序People [1]仍然是John,但是在一个For n as人循环中他们将会失序。

如果我不能解决这个问题,我只需要不必在SQL阶段进行sorting,并在JS阶段添加额外的循环和sorting到一个数组中,虽然我想避免更多的浏览器压力,因为它已经是一个Js沉重页。

非常感谢

有同样的问题,遵循dmc的解决scheme,但只是在int值前面添加一个空格,使其成为一个string。

使用空格而不是另一个非数字字符的优点是,随后的POST值可以直接在mySQLsearch子句中使用,而不必再次删除它。

不同的浏览器以不同的方式处理对象,我的错在于尝试使用我构build对象的顺序作为参考。

将整数更改为string不适用于我(Chrome,jQuery 1.7.1)。 所以为了保持顺序(是的,它的对象滥用),我改变了这个:

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

对此

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

除非这个JSON是一个数组,而不是一个对象,否则没有一个标准说明它必须按照一定的顺序。 但是,这不应该是一个问题,因为您不需要遍历对象来获取数据,您可以简单地引用该属性。

我有同样的“问题”,不想在代码中回头修改太多。 发现至less谷歌浏览器只重新sorting数字索引。 只要索引被视为一个string,它就会以“预期的”顺序显示出来。 有人可以在Opera上validation这个吗?

有些浏览器会对键值进行sorting,另一方面很容易将string转换为string,后来还原,我的解决scheme是将“i”添加到键中,这是一个窍门。 为每个浏览器完美工作:)希望帮助:)

没有解决scheme为我工作(2017年8月)。 即使我使用了stringChrome和Safari(没有testing其他浏览器)仍然基于stringsorting。 我所做的是连接我的整数键值string。 例如

 result[string_value + str(integer_key)] = string_value 

这样string是第一个,浏览器可以自由sorting。 然后,我用一些简单的逻辑将键与值分开。

希望这可以帮助。

我使用这个代码解决了这个问题:

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

并在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; ... 

你需要欺骗谷歌浏览器(和其他人)认为你有一个string,而不是一个数字。 将JSON更改为{"2423":'abc', "2555":'xyz'}将不起作用。

我不得不在我的对象中使用“_2423”和“_2555”作为索引来使其工作。

此外,debugging输出到console.log或for x in y使用for x in y给出了与_.each方法不同的结果(请参见下划线框架)。

你可以在JSFiddle中看到我的testing/certificate,使用"_"而不是前缀和for x in y循环中的for x in y : http : //jsfiddle.net/3f9jugtg/1/

在JSONstring参数中使您的对象标识符,它不工作自动sorting。

看来最好的方法是避免关联数组。 当你想发送一个关联数组时,只需将它作为两个单独的数组发送 – 键和值之一。 这里是PHP代码来做到这一点:

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

和简单的JavaScript代码来做任何你想要的东西

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

我有一个类似的问题,张贴在jQuery上:$ .getJSONsorting在Chrome / IE上的数据?

在某些情况下,您需要使用loggingID在后处理循环中对事物进行分组。 把关键的价值报价将工作。 或者你可以在最后一个数组上使用array_merge来重置键。

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

print_r($ processed_array); 现在返回以下内容:

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

我遇到了同样的问题,花了我一些时间来解决甚至导致了这个问题,真是一个痛苦。 我最终从索引中删除ID和使用array_push,而不是:

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

等我改变了

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

这使我能够保持从PHP订购,因为新的索引已经在(0,1,2,3等,而不是112,56,411等)

将数据对象传递给console.log ,JavaScript将最终调用数据对象的toString()方法。 由于您不喜欢数据的toString()方法的默认格式,因此您必须自己完成这项工作。

你可以自己转储对象的字段,如果你想要这种types的控制 – 你必须得到键/字段并对它们进行sorting,然后自己构buildstring版本。

就像是:

 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)