Новости | 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}Замечу, что данный способ не является полноценной заменной массивов, т. к. порядок сортировки не хранится в хеше, а задаётся при выводе. Реализовать вывод в порядке добавления таким образом не получится.