[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как избежать сортировку JSON / javascript (jquery)
GET
Привет, на входе строка JSON отсортированная как надо, на выходе javascript сортирует ее по ключам.

var ii=$.parseJSON(DOT);
// jQuery

var ii=JSON.parse(DOT);
//Чистый JS

Результат одинаковый.

Перебираю массив:
for(var index in ii)
{

}


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Invis1ble
как вариант, сделать ключи массива строковыми, типа
$data = [
'_2' => 'foo',
'_1' => 'bar',
];

после парсинга строки пройдешься циклом и преобразуешь ключи в нужные

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

GET
Цитата
после парсинга строки пройдешься циклом и преобразуешь ключи в нужные


Ну в том то и дело, что они как бы есть строковые с числом внутри "455" а есть и такие вида "group". Можно даже отдельный массив сделать специально с порядком, но это уже слишком...

Наткнулся на такую фразу:

Retaining object key order between unserialisation and serialisation in JavaScript is never guaranteed. The only way to guarantee key order, is to extract an object's keys, sort them according to a deterministic criteria.
**
Сохраняя объект порядок ключей между unserialisation и сериализации в JavaScript никогда не гарантировано. Единственный способ гарантировать ключевую заказ, чтобы извлечь ключи объекта, сортировать их по детерминированной критериев.

Короче, жопа какая-та! Хоть бы флаги какие-нибудь добавили к парсу, как в пхп. Везде пля какая-то анархия.

Спасибо Invis1ble.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Invis1ble
Цитата (GET @ 11.12.2015 - 16:59)
Ну в том то и дело, что они как бы есть строковые с числом внутри "455"

я это понял, лично я аналогичную проблему у себя решил именно так, как написал выше

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

sergeiss
Если хочешь сохранять порядок ключей, то исходные данные должны быть не массивом, а объектом. У объекта порядок ключей не меняется, аналогично ассоциативному массиву в ПХП.

Покажи исходные данные, оценим, что с ними можно сделать smile.gif И другой вопрос - откуда ты получаешь исходную строку JSON?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Invis1ble
Цитата (sergeiss @ 11.12.2015 - 21:14)
У объекта порядок ключей не меняется

Вообще-то, (и я уже писал об этом в другой теме, но никто не обратил внимания, по ходу) тут можно попасть в ловушку.
Порядок ключей не гарантирован спецификацией.
Так что да, самый правильный способ, насколько я понимаю - сортировать после парсинга, к сожалению.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

GET
Invis1ble
Да, я понял уже.

sergeiss
Исходная строка формируется в MySQL, пакуется PHP в JSON, чтоб потом ее со страницы забрал JS.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Цитата (GET @ 12.12.2015 - 07:37)
Исходная строка формируется в MySQL, пакуется PHP в JSON, чтоб потом ее со страницы забрал JS.

Как именно ты пакуешь? Покажи код. Скорее всего, просто "мудришь" тут. Если ты просто создашь массив, с цифровыми ключами по порядку, то в JS они потом будут правильно расположены.
И покажи строку JSON до парсинга, как она выглядит в JS (если только не очень длинная).

Если в ПХП сделать так (проще просто некуда)
$result = array();
while( $row=...._fetch(...)) {
$result[] = $row;
}
$retVal = json_encode($result);

то у каждой строки будет цифровой индекс, соответствующий порядку ее появления в массиве. После парсинга в JS всё будет на месте.

Даже если ты создашь массив в произвольном порядке, типа такого
$result[2]=2;
$result[0]=0;
$result[1]=1;

то при парсинге в JS они должны выстроиться правильно, т.е. в порядке возрастания ключей.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
GET
Цитата
Даже если ты создашь массив в произвольном порядке, типа такого
$result[2]=2;
$result[0]=0;
$result[1]=1;

то при парсинге в JS они должны выстроиться правильно, т.е. в порядке возрастания ключей.

Кодирую так:
json_encode($DOT,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);

sergeiss
В том то и дело, что мне не нужно чтоб ключи выстраивались в порядке возрастания. Конечно я могу добавить литеру, как предложил Invis1ble (тогда вероятно сортировки не будет (или все же будет по второму символу?)) или я могу еще один ключ создать, т.е. это же не проблема решить эту проблему.

Можно вообще еще один простой массив создать порядковый номер-ключ.

Вопрос один: какого хера JS (без разрешения) сортирует ключи. Я залез в jquery и понял, что они вероятно создают временный массив когда распарсивают строку и там выстраивают новый уже массив в другом порядке элементов.

Тему можно закрыть, я уже нашел решение - забить на это, место не критичное поэтому танцы с бубном здесь не нужны, пусть лучше быстрее всё работает.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
Цитата (GET @ 12.12.2015 - 10:41)
я уже нашел решение - забить на это

гениально biggrin.gif

_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (GET @ 12.12.2015 - 11:41)
В том то и дело, что мне не нужно чтоб ключи выстраивались в порядке возрастания.

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

Цитата (GET @ 12.12.2015 - 11:41)
Вопрос один: какого хера JS (без разрешения) сортирует ключи.

Потому что это стандартный алгоритм его работы smile.gif Который ты пока не понял. По сути дела, это в ПХП нестандартный алгоритм (потому что ключи символьные). А в большинстве других языков программирования именно так, как в JS.

PS. У массивов в JS ключи ВСЕГДА цифровые. Если ты задашь, например, только элементы массива с индексами 0 и 55, то длина массива будет 56. И при этом, если начнешь перебирать массив, то элементы с ключами от 1 до 54 будут undefined. И не важно, в каком порядке ты их определишь, эти 2 элемента!
Если же тебе нужны символьные ключи, то тогда в JS используй object. Визуально работа с объектами может выглядеть похоже на работу с массивом, но это не одно и то же.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
GET
Цитата
Потому что это стандартный алгоритм его работы  Который ты пока не понял. По сути дела, это в ПХП нестандартный алгоритм (потому что ключи символьные). А в большинстве других языков программирования именно так, как в JS.

PS. У массивов в JS ключи ВСЕГДА цифровые. Если ты задашь, например, только элементы массива с индексами 0 и 55, то длина массива будет 56. И при этом, если начнешь перебирать массив, то элементы с ключами от 1 до 54 будут undefined. И не важно, в каком порядке ты их определишь, эти 2 элемента!
Если же тебе нужны символьные ключи, то тогда в JS используй object. Визуально работа с объектами может выглядеть похоже на работу с массивом, но это не одно и то же.


http://javascript.ru/tutorial/object/intro...bektu-iz-metoda

Вот, как я перебираю свойства (из заглавного поста):
Цитата
Перебираю массив:
for(var index in ii)
{

}


Т.е. я и работаю с объектом-массивом и перебираю его по ключам без всяких for i++. Вопрос-то вообще не в этом. А в алгоритме распарсивания JSON. Типа в пхп (json_decode) неправильный алгоритм а в JS (JSON.parse) правильный?

Как так?
user posted image


Я отдаю JSON строку и хочу чтоб мне ее вернули в том же виде (спасибо разработчикам ПХП, что продумали несколько десятков функция для обработки и сортировки массивов), а JS мне ее возвращает отсортирванную, как по числовым ключам, типа он специально так сделал, мега язык. Да с чего вдруг, особенно когда мы работаем со строкой!? Или давайте флаг делайте к сортировке чтоб я выбирал в каком виде вернуть мне этот массив.

Чего тут я не понимаю? Что JS скудный язык, баг на баге? Invis1ble предложил добавлять литеру, чтоб все ключи отсортировались как есть (потому что JS преобразует их в 0), мне это понятно.

Цитата с той же ссылки:
Объекты (они же - ассоциативные массивы, хэши) и работа с ними в Javascript - реализованы не так, как в большинстве языков. С этим связано много ошибок и непоняток.

sergeiss, я знаю ты лобируешь интересы разработчиков javascript на этом форуме, но ты должен знать, что народ против!

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Цитата (GET @ 12.12.2015 - 16:03)
sergeiss, я знаю ты лобируешь интересы разработчиков javascript на этом форуме, но ты должен знать, что народ против!

????????????????????????????????????????????????????????????????????????????

Ну если ты не хочешь понять, как работает JSON, чем отличаются массивы и объекты в ПХП и в JS, то зачем тогда вообще спрашивал, тему заводил???

PS. Я тебе даже примерчик "накидал", проще просто некуда. Но ты его не захотел понять.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
GET
sergeiss
Цитата
????????????????????????????????????????????????????????????????????????????


Да шутка ведь... smile.gif Мне все понятно, просто тебе не понятно, что мне понятно. smile.gif

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.