Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Сортировка и фильтрация json jQuery (https://javascript.ru/forum/jquery/19113-sortirovka-i-filtraciya-json-jquery.html)

amt779 26.07.2011 15:05

Сортировка и фильтрация json jQuery
 
Есть реляционная таблца данных. Данные я получаю в json. Эти данные отображаются на клиенсткой стороне таким образом что каждая строка стаблицы отображается в форме произвольно свестанных блоков <div> и ячеек <li>.

Есть так же в клиентском интерфейсе кнопки, которые отвечают за отбор и сортировку. Надо реализовать механизм, который позволит, скрывать/отображать часть блоков и изменять порядок следования. Признаки, по которым происходит сортировка и фильтр хранятся в значениях столбцов таблицы данных.

Вариант, каждый раз выполнять ajax запрос и получать новый json набор данных - не подходит.

Подскажите, как реализовать механизм, возможно на jQuery, для манипуляции даннми на клиентской части.

Заранее спасибо.

walik 27.07.2011 09:28

Не знаете как сортировать данные ?
В нете не мало инфы.

Цитата:

Сообщение от amt779
возможно на jQuery

Sorting elements with jQuery
jQuery Plugin - Dynamic Sorting, Paging and Filtering Product list / Portfolio.
JQuery sort()

amt779 27.07.2011 17:06

Нашел такой код
var v = 'id';
$.fn.sort = function() {  
	return this.pushStack( [].sort.apply( this, arguments ), []);  
};
  
function sortAlpha(a,b){
    return a[v] * 1 < b[v] * 1 ? 1 : -1;  
};

json.sort(sortAlpha);


Мне надо както модифицировать компаратор таким образом, чтобы он принимал 3 аргумент, ключ в json, по которому надо сравнивать объекты.

Чтобы вызо выглядил таким образом

json.sort(sortAlpha,'id');
function sortAlpha(a,b,v){
    return a[v] * 1 < b[v] * 1 ? 1 : -1;  
};


как это сделать ?

kobezzza 27.07.2011 17:17

function sortBy (field, rev, fn) {
	field = field || false;
	rev = rev ? rev === true ? -1 : 1 : 1;
	fn = fn || false;
	
	return function (a, b) {
					
		if (field) {
			a = a[field];
			b = b[field];
		}
					
		if (fn) {
			a = fn(a);
			b = fn(b);
		}
					
		if (a < b) { return rev * -1; }
		if (a > b) { return rev; }
					
		return false;
	}
}

field - поле по которому идёт сортировка, rev - реверсия массива, fn - функция callback для доп действий

Пример вызова:
myArray.sort(sortBy("name"));


ЗЫ: данный вариант не совсем "правильный", т.к. результирующая функция замыкается на внешней, т.е. потенциальна течёт память, но это можно исправить, если например обе функции сделать методом одного объекта, а связь между ними - через публичные свойства.

amt779 28.07.2011 12:53

kobezzza,
Спасибо. Просветлело ))


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