| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Азат Разетдинов 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}Замечу, что данный способ не является полноценной заменной массивов, т. к. порядок сортировки не хранится в хеше, а задаётся при выводе. Реализовать вывод в порядке добавления таким образом не получится.