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

RazZzeR 21.07.2012 15:28

Сортировка массива по ключу
 
Добрый день! :thanks:

Из базы данных мы получаем несколько тысяч строк,
и команда ORDER BY ну ооочень тормозит весь процесс,
поэтому ORDER BY снял с sql запроса,
и надобность сортировки массива по-прежнему остается.
Массив получаем в json, преобразуем в обычный массив,
получаем массив например
MusicArray

каждая строка массива MusicArray - еще один массив с 10ю ключами.

тоесть древо такое:

MusicArray = [
0:[123, 133, 1, 21231233123, 1323,213323,...,1231],
1:[321,231, 33, 2123,12323,21323]....123323],
2:[223,211, 95, 213123,1223,2213]....13223],
..........................
1024:[233,223, 7, 213123,11223,23123....132123]
] // конец MusicArray

внутри каждого массива (подобного 0:[123, 133, 12323, 21231233123, 1323,213323,...,1231])
значение 3его по счету ключа - номер, ко которому должен сортироваться массив MusicArray.

Проще: Сортируем массив MusicArray, по выделенному выше значению.

Заранее спасибо за помощь :thanks:

devote 21.07.2012 15:34

var MusicArray = {
 "0":[123, 133, 1, 21231233123, 1323,213323,1231],
 "1":[321,231, 33, 2123,12323,21323,123323],
 "2":[223,211, 95, 213123,1223,2213,13223],
 "3":[233,223, 7, 213123,11223,23123,132123],
 length: 4
}

Array.prototype.sort.call( MusicArray, function( a, b ) {
    return a[2] > b[2] ? 1 : a[2] < b[2] ? -1 : 0;
});

alert( JSON.stringify( MusicArray ) );

RazZzeR 21.07.2012 16:03

Супер, работает отлично!
Это же просто шикарно, такая качественная оптимизация! :)
Devote, ну очень тебе благодарен, сколько раз уже помог)))

RazZzeR 21.07.2012 18:19

Теперь та же задача, только сортировать по убыванию.
только вот в чем смысл: есть статус онлайн, и оффлайн.
тоесть int значение 1 и 0
Массив такой же как и пару постов выше, только ключ 6й,
надо сначала в массиве онлайн поднять, а все оффлайн снизу.

Это уже другой элемент оптимизируем :)

devote 21.07.2012 18:26

ну дык меняйте значения 1 и -1 в функции сортировки, они и сменют порядок.. а ключ вместо 2-ки впишите 5-ку

RazZzeR 21.07.2012 19:19

Array.prototype.sort.call(profile_friends, function(a,b){
return a[6] > b[6] ? -1 : a[6] < b[6] ? -1 : 0;
});

Получилось так, что в массиве сначало 1 оффлайн вверху, потом все онлайн, потом все оффлайн

тоесть вверху значение 6ого ключа равно 0, потом все строки массива со значением этого ключа 1, а потом снова все остальные со значением 0

RazZzeR 21.07.2012 19:23

сделал так: заработало
Array.prototype.sort.call(profile_friends, function(a,b){
return a[6] > b[6] ? -1 : a[6] < b[6] ? +1 : 0;
});


еще раз: благодарен :thanks:

devote 21.07.2012 19:26

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

Цитата:

Сообщение от RazZzeR
+1

ну плюс то тут не обязателен. достаточно просто 1

RazZzeR 21.07.2012 19:29

Цитата:

Сообщение от devote (Сообщение 190579)
RazZzeR,
тебе же по шестому ключу надо было сортировать, а ты по седьмому сортируешь.. Индексы же с нуля начинаются, тоесть шестой ключ это значение 5.

я раньше неправильно выразился :)
номер ключа 6, а номер ключа по счету - 7. :)

RazZzeR 21.07.2012 19:31

Ааа, кстати! забыл рассказать:
сортировка отнимает очень много времени в sql.
ну очень.
было от 150ms - 600ms
сейчас всегда 50-60 ms
это очень хорошо.

плюс файловое кеширование поставим, давно пора)
каждый раз извлекать 500 - 1000 строк это извращение)))


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