Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Сортировка массива (https://javascript.ru/forum/dom-window/28997-sortirovka-massiva.html)

Евгений7 10.06.2012 18:05

Сортировка массива
 
Приветик всем. Извиняюсь если пишу не в тот форум, у меня следующая проблема. Создаю запрос с помощью AJAX, получаю данные из базы и вывожу их в динамическом селекте. Сортировка из базы идёт по возрастанию значения, например "id=1 value= А", "id=2 value= C" "id=3 value= D" "id=4 value=B". Это данные в БД (есть поле id и поле value). При выборке из базы конечно же написано ORDER BY 'value'. Мне надо вывести значения в селекте по возрастанию (точнее вместо букв могут быть слова, но всё равно сортировка нужна по алфавиту). Итак что я имею: данные в базе, указанные выше и код:
for(var idx in selects){
            var opts = new Array();
            for(i in selects[idx].opts){
                opts[i]=selects[idx].opts[i];
//console.log(opts[i]); 
//Здесь данные приходят отсортированные по возрастанию значения (по алфавиту, либо по цифрам, но не по id, т.е. всё верно)
            }
//console.log(opts);
// а вот в opts значения уже отсортированы по id, т.е. при переборе массива данные идут в правильном порядке, а после полного создания массива отсортированы по id.

В итоге при создании селекта значения выводятся в таком порядке: A, C, D, B. Нужно сделать так: A, B, C, D.
В selects пришедшие данные в JSON. Как сделать так, чтобы массив был сформирован не по id а по значениям?
Есть советы?

devote 10.06.2012 18:13

var selects = [
{ id: 1, value: "Anton" },
{ id: 2, value: "Dima" },
{ id: 3, value: "Borya" },
{ id: 4, value: "Carl" }
]

selects.sort(function( a, b ){
    return a.value > b.value ? 1 : ( a.value < b.value ? -1 : 0 );
});

for( var idx in selects ) {
    alert( selects[ idx ].value );
}

Евгений7 10.06.2012 18:22

Совсем забыл сказать, что JS я не понимаю вообще, методом тыка учусь, сколько не пытался понять не смог. Поэтому даже не могу понять откуда взялись ф-ии a и b и где они написаны.. Т.е. Ваш пример мне абсолютно не понятен, как применить его к моему коду? И alert мне как бы не нужен, мне надо просто сформировать массив, который я уже буду выводить в селекте

devote 10.06.2012 18:25

Цитата:

Сообщение от Евгений7
Т.е. Ваш пример мне абсолютно не понятен, как применить его к моему коду?

просто добавьте у себя вот это:
selects.sort(function( a, b ){
    return a.value > b.value ? 1 : ( a.value < b.value ? -1 : 0 );
});
перед
for(var idx in selects){
и все будет норм и если нужно отсортировать по другому полю, просто замените внутри функции свойства value на те что вам нужны

devote 10.06.2012 18:29

хотя я так понял вам совсем иное надо. В идеале было бы хорошо если бы привели хотя бы какой-то рабочий пример, тогда можно было бы к нему применить то чего вам нужно. Но по вашему сообщению сложно понять что сортировать

Евгений7 10.06.2012 18:33

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

devote 10.06.2012 18:34

Евгений7,
ну приведите пример JSON данных, и скажите по каким данным нужна сортировка.

Deff 10.06.2012 18:40

Евгений7,
Хм - есть же возможность ссылки на json файл,
а) Задача становицо интересной,
b) Решение максимально приближено к объективной реальности!

Евгений7 10.06.2012 18:40

Не получается у меня ничего, не работает. Пример чего именно нужен? Не понимаю ничего. Какая ссылка на JSON файл?? Никакого JSON файла нету, данные берутся из БД и через json() возвращаются в JS. Да и пример json данных не могу сделать, просматриваю их через файербаг, какие то данные есть, но как их скопировать и какие именно данные, их там уйма я не понимаю. Должен был сразу сказать что полный валенок. Сейчас код выглядит так:
var selects = option.option;
selects.sort(function( a, b ){
    return a.value_option > b.value_option ? 1 : ( a.value_option < b.value_option ? -1 : 0 );
});
            for(var idx in selects){
            var opts = new Array();
            for(i in selects[idx].opts){
                opts[i]=selects[idx].opts[i];
                //console.log(opts[i]); //ВЕРНО
            }

получается что ф-я не возвращает никаких selects, (для for), она возвращает вообще не понятно что судя из кода "return a.value_option > b.value_option ? 1 : ( a.value_option < b.value_option ? -1 : 0 );". Что с этим кодом что без него никаких изменений нет, данные также выводятся в порядке id

Deff 10.06.2012 18:45

Евгений7,
чтобы забрать json - нун передать ссылку

Воть ссылка и параметры при вбивке в адресное брауза - должно увидецо файл на странице


Часовой пояс GMT +3, время: 13:55.