Подтвердить что ты не робот

Как остановить Chrome и Opera, сортируя объекты JSON по индексу ASC?

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

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

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

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

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

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

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

Спасибо

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Имела ту же проблему, после решения dmc, но просто добавила пространство перед значением int, чтобы сделать его строкой.

Преимущество использования пробела, а не другого нецифрового символа заключается в том, что последующее POSTED-значение может быть использовано непосредственно в предложении mySQL, без необходимости его снова удалять.

Ответ 3

Изменение целого числа в строку не помогло мне (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"}};

Ответ 4

Если JSON не является массивом, а не объектом, то нет стандарта, который говорит, что он должен быть в определенном порядке. Однако это не должно быть проблемой, поскольку вам не нужно перебирать объект для получения данных, вы можете просто ссылаться на свойство.

Ответ 5

У меня была такая же "проблема", и я не хотел возвращаться и слишком сильно менялся в коде. Выяснилось, что по крайней мере Google Chrome только повторно сортирует числовые индексы. Пока индекс считается строкой, он будет отображаться в "предполагаемом" порядке. Может ли кто-нибудь подтвердить это в Opera?

Ответ 6

Некоторые браузеры будут сортировать ключи, которые являются int, с другой стороны, очень легко изменить это на строку и позже вернуться, мое решение заключалось в том, чтобы добавить "i" к ключу, что сделало трюк. Отлично работает для каждого браузера:) Надеюсь, что это поможет:)

Ответ 7

Ни один из решений не работал у меня (август 2017 года). Даже если я использовал строку Chrome и Safari (не тестировал другие браузеры), по-прежнему сортировались на основе строки. Вместо этого я решил объединить мой целочисленный ключ со строкой значений. например

result[string_value + str(integer_key)] = string_value

Таким образом, строка первая, и браузер может сортировать. Затем я использовал простую логику, чтобы отделить ключ от значения.

Надеюсь, что это поможет.

Ответ 8

Вам нужно обмануть Google Chrome (и другие), подумав, что у вас есть строка, а не номер. Изменение JSON на {"2423":'abc', "2555":'xyz'} не будет работать.

Мне пришлось использовать "_2423" и "_2555" в качестве индексов в моем объекте, чтобы заставить его работать.

Кроме того, отладка вывода на console.log или с помощью for x in y дала разные результаты по методу _.each (см. фреймворк подчеркивания).

Вы можете увидеть мой тест/доказательство в JSFiddle с помощью "_" против префикса и цикла for x in y: http://jsfiddle.net/3f9jugtg/1/ p >

Ответ 9

Я решил эту проблему, используя этот код:

$('.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;

...

Ответ 10

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

Ответ 11

Кажется, лучший способ - избегать ассоциативных массивов вообще. Когда вы хотите отправить ассоциированный массив, просто отправьте его как два отдельных массива - один из ключей и один из значений. Вот код 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: $.getJSON сортировка данных в Chrome/IE?

Ответ 12

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

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

array_merge($processed_array);

A print_r ($ обработанный_аррей); теперь возвращает следующее:

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

Ответ 13

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

Ответ 14

Когда вы передаете объект данных 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)