parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

foreachSort — сортировка хеша по произвольному ключу

Азат Разетдинов 08.08.2007 20:46

Многих в парсере напрягает произвольный порядок элементов хеша. У Миши в классе Lib.p даже есть метод, сортирующий хеш по ключу. Однако часто необходима сортировка по произвольному выражению. Для решения этой задачи и был написан оператор foreachSort.
###########################################################################
# operator look over all hash elements with specified order
@foreachSort[hHash;sKeyName;sValueName;jCode;sSeparator;jOrder;sDirection][tKey]
^if($hHash is "hash"){
	$tKey[^table::create{key	order^hHash.foreach[$sKeyName;$sValueName]{^#0A$$sKeyName	$jOrder}}]
	^if(!def $sDirection){$sDirection[asc]}
	^try{
		^tKey.sort($tKey.order)[$sDirection]
	}{
		$exception.handled(1)
		^tKey.sort{$tKey.order}[$sDirection]
	}
	$result[^tKey.menu{^if(def $sKeyName){$caller.[$sKeyName][$tKey.key]}^if(def $sValueName){$caller.[$sValueName][$hHash.[$tKey.key]]}$jCode}[$sSeparator]]
}{
	^throw[Lib;foreachSort;Variable must be hash]
}
#end @foreachSort[]
Пример использования:
$h[
	$.1[
		$.name[foo]
		$.sort_order(2)
	]
	$.2[
		$.name[bar]
		$.sort_order(1)
	]
]

# сортировка по ключу (аналог ^Lib:foreach)
^foreachSort[$h;k;v]{$k = $v.name}[|]{$k}

# сортировка по выражению
^foreachSort[$h;k;v]{$k = $v.name}[|]{$v.sort_order}
Замечу, что данный способ не является полноценной заменной массивов, т. к. порядок сортировки не хранится в хеше, а задаётся при выводе. Реализовать вывод в порядке добавления таким образом не получится.