powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Сортировочная функция для объектов JS
3 сообщений из 3, страница 1 из 1
Сортировочная функция для объектов JS
    #38706495
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока делаю свою частную задачу, вылезает куча нюансов, которые наверняка уже решены, но которые нужно знать, где искать.
Есть такая задача — отсортировать хеш по нескольким критериям:
Код: 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
Сортировочная функция для объектов JS
    #38706551
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Сортировочная функция для объектов JS
    #38706561
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, спасибо.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Сортировочная функция для объектов JS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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