Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Как избежать сортировку JSON / javascript (jquery)
GET  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



TERRAFORMING ENGINEER
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 3846
Пользователь №: 21196
На форуме: 6 лет, 9 месяцев, 4 дня
Карма: 87




Привет, на входе строка JSON отсортированная как надо, на выходе javascript сортирует ее по ключам.

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

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

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

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

}


--------------------
Не тот велик, кто не падал, а тот кто падал и поднимался.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Invis1ble  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 11787
Пользователь №: 23195
На форуме: 6 лет, 4 месяца, 13 дней
Карма: 429

Трезвый :
7 лет, 3 месяца, 13 дней


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

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


--------------------
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
GET  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



TERRAFORMING ENGINEER
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 3846
Пользователь №: 21196
На форуме: 6 лет, 9 месяцев, 4 дня
Карма: 87




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


Ну в том то и дело, что они как бы есть строковые с числом внутри "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.


--------------------
Не тот велик, кто не падал, а тот кто падал и поднимался.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Invis1ble  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 11787
Пользователь №: 23195
На форуме: 6 лет, 4 месяца, 13 дней
Карма: 429

Трезвый :
7 лет, 3 месяца, 13 дней


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

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


--------------------
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14974
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 1 день
Карма: 443




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

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


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Invis1ble  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме




******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 11787
Пользователь №: 23195
На форуме: 6 лет, 4 месяца, 13 дней
Карма: 429

Трезвый :
7 лет, 3 месяца, 13 дней


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

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


--------------------
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
GET  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



TERRAFORMING ENGINEER
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 3846
Пользователь №: 21196
На форуме: 6 лет, 9 месяцев, 4 дня
Карма: 87




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

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


--------------------
Не тот велик, кто не падал, а тот кто падал и поднимался.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14974
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 1 день
Карма: 443




Цитата (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
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
GET  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



TERRAFORMING ENGINEER
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 3846
Пользователь №: 21196
На форуме: 6 лет, 9 месяцев, 4 дня
Карма: 87




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

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

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

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

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

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

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


--------------------
Не тот велик, кто не падал, а тот кто падал и поднимался.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5493
Пользователь №: 35718
На форуме: 4 года, 17 дней
Карма: 167




Цитата (GET @ 12.12.2015 - 10:41)
я уже нашел решение - забить на это

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


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14974
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 1 день
Карма: 443




Цитата (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. Визуально работа с объектами может выглядеть похоже на работу с массивом, но это не одно и то же.

Это сообщение отредактировал sergeiss - 12.12.2015 - 12:07


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
GET  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



TERRAFORMING ENGINEER
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 3846
Пользователь №: 21196
На форуме: 6 лет, 9 месяцев, 4 дня
Карма: 87




Цитата
Потому что это стандартный алгоритм его работы  Который ты пока не понял. По сути дела, это в ПХП нестандартный алгоритм (потому что ключи символьные). А в большинстве других языков программирования именно так, как в 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 на этом форуме, но ты должен знать, что народ против!


--------------------
Не тот велик, кто не падал, а тот кто падал и поднимался.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14974
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 1 день
Карма: 443




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

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

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

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

Это сообщение отредактировал sergeiss - 12.12.2015 - 16:57


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
GET  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



TERRAFORMING ENGINEER
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 3846
Пользователь №: 21196
На форуме: 6 лет, 9 месяцев, 4 дня
Карма: 87




sergeiss
Цитата
????????????????????????????????????????????????????????????????????????????


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


--------------------
Не тот велик, кто не падал, а тот кто падал и поднимался.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса