Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Сортировочная функция для объектов JS / 3 сообщений из 3, страница 1 из 1
26.07.2014, 12:03
    #38706495
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировочная функция для объектов JS
Пока делаю свою частную задачу, вылезает куча нюансов, которые наверняка уже решены, но которые нужно знать, где искать.
Есть такая задача — отсортировать хеш по нескольким критериям:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
data = 
{
  'key1':
  {
    'id':'key1',
    'index':1,
    'serial':'123',
    'state':1,
    'title':'text1',
    ...
  },
  ...
}


1. Если есть объекты со state!=1, то они должны идти вначале списка.
2. Затем объекты сортируются по index (число).
3. Если index не задан или одинаковый, то идет сортировка по title (строка).

Такого рода сортировка мне нужна в нескольких местах для нескольких разных типов объектов.
Чтобы не повторять код, написал такую функцию:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
function _Sort(a,b,defs)
{
	for (var idx in defs)
	{
		var field = defs[idx];
		if (a.hasOwnProperty(field.name) && b.hasOwnProperty(field.name))
		{
			var v1 = a[field.name], v2 = b[field.name];
			if (field.type==='map')
			{
				var map = field.map;
				var def = (map.hasOwnProperty('*') ? map['*'] : null);
				v1 = (map.hasOwnProperty(v1) ? map[v1] : def);
				v2 = (map.hasOwnProperty(v2) ? map[v2] : def);
			}
			else if (field.type==='int')
			{
				v1 = Number(v1);
				v2 = Number(v2);
			}
			if (field.hasOwnProperty('default'))
			{
				if (typeof(v1)==='undefined') v1 = field.default;
				if (v1===null) v1 = field.default;
				if (typeof(v2)==='undefined') v1 = field.default;
				if (v2===null) v2 = field.default;
			}
			if (v1!==v2)
			{
				return (v1<v2 ? -1 : 1);
			}
		}
		else
		{
			return (a.hasOwnProperty(field.name) ? -1 : 1);
		}
	}
	return 0;
}


Вызывается примерно так:
Код: javascript
1.
2.
3.
	var index = [];
	for (var id in data) index.push(id);
	index.sort(function(a,b) {return _Sort(data[a],data[b],[{'name':'state', 'type':'map', 'map':{1:1,'*':2}}, {'name':'index', 'type':'int', 'default':0}, {'name':'serial'}]);});



Просьба проверить, не упустил ли чего.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
26.07.2014, 14:38
    #38706551
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировочная функция для объектов JS
Alibek B.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
if (a.hasOwnProperty(field.name) && b.hasOwnProperty(field.name))
		{
			...
		}
		else
		{
			return (a.hasOwnProperty(field.name) ? -1 : 1);
		}



тут делается выход из функции, даже если у обоих объектов нет указанного свойства (вернется 1).
...
Рейтинг: 0 / 0
26.07.2014, 15:09
    #38706561
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировочная функция для объектов JS
Действительно, спасибо.
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Сортировочная функция для объектов JS / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]