parser

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

 

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

Ответ

G_Z 28.11.2019 01:57

@main[]
$hash[
	$.a[
		$.c(1)
		$.d(2)
	]
	$.b[3]
	$.e[4]
	$.f[2]
]

<pre>
	^json:string[^select[$hash][;value]($value == 2)[
		$.recursive(true)
	]][
		$.indent(true)
	]
</pre>


@select[hash;key_name;value_name;condition;options][locals]
$result[^hash::create[]]

$recursive(^options.recursive.bool(false))
$index(0)

^hash.foreach[key;value]{
	^if($value is hash && $recursive){
		^result.add[^select[$value;$key_name;$value_name]{
			$caller.$key_name[$$key_name]
			$caller.$value_name[$$value_name]

			$condition
		}[$options]]
	}{
		$caller.$key_name[$key]
		$caller.$value_name[$value]

		^if($condition){
			^result.add[^hash.at($index)[hash]]
		}
	}

	^index.inc[]
}


# @select[hash;key_name;value_name;condition;options][locals]
# $result[^hash::create[]]

# $recursive(^options.recursive.bool(false))
# $index(0)

# ^hash.foreach[key;value]{
# 	^if($value is hash && $recursive){
# 		$selected[
# 			$.$key[^select[$value;$key_name;$value_name]{
# 				$caller.$key_name[$$key_name]
# 				$caller.$value_name[$$value_name]

# 				$condition
# 			}[$options]]
# 		]
# 	}{
# 		$caller.$key_name[$key]
# 		$caller.$value_name[$value]

# 		^if($condition){
# 			$selected[^hash.at($index)[hash]]
# 		}
# 	}

# 	^result.add[$selected]

# 	^index.inc[]
# }
Если нужен плоский вид результата, то используем первый метод:
{
	"d":2,
	"f":"2"
}
Если вложенный — второй:
{
	"a":{
		"d":2
	},
	"f":"2"
}
^hash.at($index)[hash]
вместо
$.$key[$value]
чтобы сохранять тип значения, не приводя числа к строкам.