| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
G_Z 02.12.2019 03:32 / 02.12.2019 03:36
Имхо, тогда уж что-нибудь совсем маловероятное, типа _key_149571943;_value_149571943, т.к. _key и _value все таки применяются, а ошибку эту не зная ее природы фиг найдешь, если ключи совпали.Против этого должна помочь передача $caller'а в опциях (ниже пример; это и в целом упрощает код).
Почему понятно, $condition в ветке с рекурсией мы не проверяем, а просто прокидываем вглубь. Поэтому ключи, в которых не значения, а вложенные хэши мы просто пропускаем. Если проверить $condition до рекурсии, то мы получим ошибку несовпадения типов $value, в общем случаеУсловие $value == '3' — странное.
^json:string[^select[$hash][key;value]($key eq 'b' && $value == '3')
Упадет, когда в ключе окажется хэшВ ключе не может быть хэша, только в значении.
($key eq 'b' && $value is string && $value eq '3')Но в целом лучше продумать требования к подобным случаям.
@select[hash;key_name;value_name;condition;options][locals]
$result[^hash::create[]]
$recursive(^options.recursive.bool(false))
^if(def $options.caller){
$_caller[$options.caller]
}{
$_caller[$caller.self]
}
$index(0)
^hash.foreach[_key;_value]{
$_caller.$key_name[$_key]
$_caller.$value_name[$_value]
^if($condition){
^result.add[^hash.at($index)[hash]]
}($_value is hash && $recursive){
^result.add[^select[$_value;$key_name;$value_name]($condition)[
^hash::create[$options]
$.caller[$caller.self]
]]
}
^index.inc[]
}P. S. А ещё в хэше могут быть рекурсивные ссылки на любой ключ, в том числе на сам хэш.