Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2010, 23:35   #1
kirosin
Форумчанин
 
Аватар для kirosin
 
Регистрация: 15.01.2010
Сообщений: 209
По умолчанию сортировка массива

Почему-то элементы массива выводятся не по порядку, эксплорер при небольшом количестве элементов выводит по порядку, при большом количестве элементов почему-то произвольно сортирует по имени, хотя его никто не просил сортировать, а опера сортирует по идентификатору.
Как отсортировать такой массив по имени?
Код:
<head>
<script language="javascript">
var Name = {12:"Иван",19:"Вася",36:"Петя",32:"Антон",13:"Семен"};
function Do() {
for (i in Name) {document.write(Name[i],'-',i,'<br>');}
}
</script>
</head>
<body onload="Do()">
</body>
Пробовал Name.sort(); но он не работает.
Все генитальное просто.
kirosin вне форума Ответить с цитированием
Старый 24.11.2010, 00:04   #2
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Дело в том, что конструкция for (i in Name) не гарантирует воспроизведения объекта в исходном порядке.
http://stackoverflow.com/questions/2...bject-property
SkyM@n вне форума Ответить с цитированием
Старый 24.11.2010, 11:50   #3
XFree
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 26
По умолчанию

Это не упорядоченный массив, а ассоциативный (хэш), поэтому он может храниться как угодно, также и выводится. Если тебе приходится выполнять такую задачу, то скорее всего ты используешь не верную структуру данных или используешь её не по назначению. Хочу предложить примерно следующее.
Код:
<head>
<script language="javascript">
var names = [
            {id: 12, name: "Иван"},
            {id: 19, name: "Вася"},
            {id: 36, name: "Петя"},
            {id: 32, name: "Антон"},
            {id: 13, name: "Семен"}
            ];

//Создаем функцию с правилами сортировки
function sortFunction(a,b) {
    if (a['id'] > b['id']){
       return 1;
    } else if (a['id'] < b['id']){
      return -1;
    } else {
      return 0;
    }
}           
function Do() {
names.sort(sortFunction);
for (var i = 0; i < names.length;i++) {
      document.write(names[i]['id'] + '-' + names[i]['name'] + '<br>');
      }
}
</script>
</head>
<body onload="Do()">
</body>
Теперь меняя алгоритм функции сортировки можно упарвлять сортировкой. И ещё одно - сортируется исходный массив! Для того, чтобы исходный массив остался без изменений, то его нужно скопировать, например вот так var _copyNames = names.slice(0,names.length);

Последний раз редактировалось XFree; 24.11.2010 в 12:08. Причина: Дополнение к материалу.
XFree вне форума Ответить с цитированием
Старый 24.11.2010, 17:11   #4
kirosin
Форумчанин
 
Аватар для kirosin
 
Регистрация: 15.01.2010
Сообщений: 209
По умолчанию

Массив такого вида я получаю посредством API. Есть ли возможность преобразовать ассоциативный массив в упорядоченный, чтобы потом отсортировать?
Все генитальное просто.
kirosin вне форума Ответить с цитированием
Старый 24.11.2010, 17:57   #5
XFree
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 26
По умолчанию

Лучше сразу массив сделать таким, если тебе не нужно получать знаечние по ключу. А так вообще берешь и делаешь вот так
Код:
var names = {12:"Иван",19:"Вася",36:"Петя",32:"Антон",13:"Семен"};
var newArray = [];
for (key in names) {
      newArray.push({id: key, name: names[key]});
}
XFree вне форума Ответить с цитированием
Старый 25.11.2010, 06:22   #6
kirosin
Форумчанин
 
Аватар для kirosin
 
Регистрация: 15.01.2010
Сообщений: 209
По умолчанию

чото я окончательно запуталося... попробовал так, не работает
Код:
<script language="javascript">
var names = {12:"Иван",19:"Вася",36:"Петя",32:"Антон",13:"Семен"}; //в таком виде я получаю массив посредством API
var newArray = [];
for (key in names) {
      newArray.push({id: key, name: names[key]});
}

names.sort(sortFunction);
for (var i = 0; i < names.length;i++) {
      document.write(names[i]['id'] + '-' + names[i]['name'] + '<br>');
      }

function sortFunction(a,b) {
    if (a['id'] > b['id']){
       return 1;
    } else if (a['id'] < b['id']){
      return -1;
    } else {
      return 0;
    }
}
</script>
Все генитальное просто.
kirosin вне форума Ответить с цитированием
Старый 25.11.2010, 09:49   #7
XFree
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 26
По умолчанию

Не работает потому, что ошибки в программе. Попытайся разобраться, а не просто копируй.
1. Хоть интерпритатор и умный и находит функцию, хотя она объявлена после вызова, но это плохая практика. Ладно это работает.
2. Сортировка должна применяться к массиву или пиши свою функцию сортирвки с преобразованием в масив для хэша. Будь внимателен. Рабочий код:
Код:
<script language="javascript">

var names = {12:"Иван",19:"Вася",36:"Петя",32:"Антон",13:"Семен"}; //в таком виде я получаю массив посредством API
var newArray = [];
function sortFunction(a,b) {
    if (a['id'] > b['id']){
       return 1;
    } else if (a['id'] < b['id']){
      return -1;
    } else {
      return 0;
    }
}
for (key in names) {
      newArray.push({id: key, name: names[key]});
}
newArray.sort(sortFunction);
for (var i = 0; i < newArray.length;i++) {
      document.write(newArray[i]['id'] + '-' + newArray[i]['name'] + '<br>');
      }
</script>
А твой апи получает значение из базы или откуда? Может можно и в другом виде массив получить, а может и сразу отсортировать?
XFree вне форума Ответить с цитированием
Старый 26.11.2010, 09:53   #8
kirosin
Форумчанин
 
Аватар для kirosin
 
Регистрация: 15.01.2010
Сообщений: 209
По умолчанию

Благодарю, все работает!
Цитата:
Сообщение от XFree Посмотреть сообщение
А твой апи получает значение из базы или откуда? Может можно и в другом виде массив получить, а может и сразу отсортировать?
В другом виде получить массив нельзя. Как я понимаю, скрипт на сервере собирает информацию из БД с определенной периодичностью и помещает этот массив в файл, а потом я получаю массив и передаю его скрипту:
Код:
<script language="javascript">
<?
$filename = "http://server.com/api/names";
echo file_get_contents($filename);
?>
//далее идет обработка массива 
</script>
Все генитальное просто.
kirosin вне форума Ответить с цитированием
Старый 26.11.2010, 17:13   #9
XFree
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 26
По умолчанию

Я так понял, что там у Вас PHP стоит?
Если так, то. Сортирвку и приведение в нужный вид нужно делать на PHP.
JavaScript клиентский язык и его скорость заивсит от броузера и ресурсов машины, а если сделать на PHP, то данные будут приходить с сервера.
XFree вне форума Ответить с цитированием
Старый 27.11.2010, 04:32   #10
kirosin
Форумчанин
 
Аватар для kirosin
 
Регистрация: 15.01.2010
Сообщений: 209
По умолчанию

Цитата:
Я так понял, что там у Вас PHP стоит?
Правильнее сказать "там у них PHP стоит"
Если б у меня был доступ к ихней БД, то я бы с яваскриптом и не заморачивался, но приходится работать с тем, что мне выдают. Зато теперь все работает как нужно, все правильно сортируется и отображается. Благодарю за помощь ))
Все генитальное просто.
kirosin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива методами предсортировки и слияния, и пирамидальная сортировка. lenny_24 Помощь студентам 2 17.04.2011 18:57
Сортировка массива 8edrius Помощь студентам 0 08.05.2010 03:31
Сортировка массива ttjke Помощь студентам 0 01.12.2009 20:03
Сортировка массива Helennna Microsoft Office Excel 7 06.08.2009 18:41
Сортировка массива на Си Покемон Общие вопросы C/C++ 2 01.11.2008 08:24