Как остановить сортировку объектов JSON в Chrome и Opera по индексу ASC? - PullRequest
60 голосов
/ 16 февраля 2011

У меня проблема.

Используя ajax, я отправил правильно сформированный объект JSON, используя:

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

Однако Opera и Chrome, хотя и получают один и тот же объект, распечатывают объект в неправильном порядке, похоже, что они оба выполняют сортировку по номеру ID, а не просто оставляют его в покое!

Есть ли способ остановить эту автосортировку?

Редактировать, узнав, что это сортировка по номеру индекса, я думаю, что лучшим способом может быть не использовать индекс для хранения object_id, а вместо этого сохранить номер идентификатора, по которому я хочу упорядочить объект.

Однако я все же хотел бы знать, есть ли способ остановить сортировку.

Спасибо

Edit2, я просто хотел бы отметить, что я собираюсь работать над другим способом сделать это, так как я чувствую, что я злоупотребляю объектами с помощью этого метода. Однако я все еще хотел бы понять, почему Opera и Chrome считают, что они имеют право изменять порядок идентификаторов моих объектов:

Проблема заключается в том, что я пытаюсь сэкономить вычислительную мощность, скажем, у нас есть люди с ID,

1.Джон, 2.Франк и 3.Салли. Однако у каждого из этих людей есть набор свойств высоты (и другие вещи). 1.Дж.180, 2.Франк.220, 3.Салли.150. Чтобы сэкономить на обработке, я запрашиваю, чтобы результаты людей сортировались по их росту, поэтому я получаю массив 2, 1, 3 с другими их свойствами. Я JSON этот массив и отправить его в браузер.

Теперь FF сохранит новый порядок Люди [1] все равно были бы Джоном, но в цикле For n как человек они будут не в порядке.

Если я не смогу обойти это, мне просто не нужно будет заниматься сортировкой на этапе SQL и добавить дополнительные циклы и сортировку в массив на этапе JS, хотя я хотел избежать большей нагрузки на браузер, так как это уже тяжелая страница Js.

Большое спасибо

Ответы [ 16 ]

0 голосов
/ 26 марта 2018

Один прием, который может помочь, заключается в следующем:

Вы должны добавить «i» к ключу, пока вы готовите свои данные для цикла, который сделал трюк.Отлично работает для каждого браузера.

для примера:

 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

Следовательно, ваш объект будет выглядеть следующим образом:

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

надеюсь, это поможет:)

0 голосов
/ 16 февраля 2018

У меня была такая же проблема с хромом, поэтому расстраивает. Я посылаю это определенным образом, почему Chrome не может поверить мне на слово? Я понимаю, что нет «стандартного» способа, но если это так, зачем навязывать свой заказ ??

Во всяком случае, я справился с этим, превратив мои объекты в массивы, так что

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

стал

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

Пришлось изменить какой-то javascript, но в итоге он работал отлично.

0 голосов
/ 07 февраля 2016

У меня была та же проблема, и я потратил некоторое время на то, чтобы понять, что ее вызывает, какая боль.В итоге я удалил идентификатор из индекса и использовал 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 и т. Д.)

0 голосов
/ 02 марта 2012

В некоторых случаях вам понадобится использовать идентификатор записи для группировки вещей в цикле постобработки.Кавычки вокруг значения ключа будут работать.Или вы можете использовать array_merge для окончательного массива, который сбрасывает ключи.

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

array_merge($processed_array);

print_r ($ processing_array);теперь возвращает следующее:

$processed_array = array(
  0=>array("id"=>235,"name"=>"Something"),
  1=>array("id"=>27,"name"=>"Something")
);
0 голосов
/ 18 февраля 2011

Сделайте ваш идентификатор объекта в строковом параметре JSON, он работает без автоматической сортировки.

0 голосов
/ 16 февраля 2011

Когда вы передаете объект данных в console.log, JavaScript в конечном итоге вызовет метод toString() для объекта данных. Поскольку вам не нравится формат данных toString(), используемый по умолчанию, вам придется выполнять работу самостоятельно.

Вы можете сбросить поля объекта самостоятельно, если вам нужен этот тип элемента управления - вам нужно получить ключи / поля и отсортировать их, а затем самостоятельно создать строковую версию.

что-то вроде:

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)
...