查找包含文本的字段并将其替换为另一个文本
Find fields which contains a text and replace it with another text
在下面的 JSON 示例中,如何找到所有包含字符串 "Choice" 的元素并将它们替换为另一个字符串,例如 "Grade"。
因此,下面所有字段名称“***Choice”应更改为“***Grade”。
我在下面粘贴了预期的输出。鉴于我不知道有多少字段将包含字符串 "Choice",我不想简单地执行直接查找和替换的 [$in ~> | ** [firstChoice] | {"firstGrade": firstChoice}, ["firstChoice"] | ;]
。
{
"data": {
"resourceType": "Bundle",
"id": "e919c820-71b9-4e4b-a1c8-c2fef62ea911",
"firstChoice": "xxx",
"type": "collection",
"entry": [
{
"resource": {
"resourceType": "Condition",
"id": "SMART-Condition-342",
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "38341003",
"display": "Essential hypertension",
"firstChoice": "xxx"
}
],
"text": "Essential hypertension"
},
"clinicalStatus": "active",
"secondChoice": "xxx"
},
"search": {
"mode": "match"
}
}
]
}
}
预期输出
{
"data": {
"resourceType": "Bundle",
"id": "e919c820-71b9-4e4b-a1c8-c2fef62ea911",
"firstGrade": "xxx",
"type": "collection",
"entry": [
{
"resource": {
"resourceType": "Condition",
"id": "SMART-Condition-342",
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "38341003",
"display": "Essential hypertension",
"firstGrade": "xxx"
}
],
"text": "Essential hypertension"
},
"clinicalStatus": "active",
"secondGrade": "xxx"
},
"search": {
"mode": "match"
}
}
]
}
}
可能有更简单的方法,但这是我在 JSONata 中想出的表达式:
(
$prefixes := $keys(**)[$ ~> /Choice$/].$substringBefore('Choice');
$reduce($prefixes, function($acc, $prefix) {(
$choice := $prefix & "Choice";
$acc ~> | ** [$lookup($choice)] | {$prefix & "Grade": $lookup($choice)}, [$choice] |
)}, $$)
)
它看起来很糟糕,但无论如何我都会解释我是如何构建它的。
您从表达式开始
$ ~> | ** [firstChoice] | {"firstGrade": firstChoice}, ["firstChoice"] |
如果你只想替换一个选项,而且你知道全名,这很好。如果要替换多个,则可以按如下方式将它们链接在一起:
$ ~> | ** [firstChoice] | {"firstGrade": firstChoice}, ["firstChoice"] |
~> | ** [secondChoice] | {"secondGrade": secondChoice}, ["secondChoice"] |
~> | ** [thirdChoice] | {"thirdGrade": thirdChoice}, ["thirdChoice"] |
此时,您可以创建一个采用选择前缀和 returns 部分替换的高阶函数(请注意,|...|...|
语法会生成一个函数)。然后,您可以使用内置的 $reduce()
高阶函数将它们链接在一起以获得前缀数组。所以你得到这样的东西:
(
$prefixes := ["first", "second", "third"];
$reduce($prefixes, function($acc, $prefix) {(
$choice := $prefix & "Choice";
$acc ~> | ** [$lookup($choice)] | {$prefix & "Grade": $lookup($choice)}, [$choice] |
)}, $$)
)
但是如果你不知道前面的前缀集,并且想要 select,比如说,所有以 'Choice' 结尾的 属性 名称,下面的表达式会给你的:
$prefixes := $keys(**)[$ ~> /Choice$/].$substringBefore('Choice')
这就是我最后的表达方式。您可以对您的数据进行试验 here in the exerciser。
我知道那是 2019 年,但这里有一个替代解决方案可以帮助未来的读者。
$replace($string(),/([first|second|third])Choice/,"Grade")~>$eval()
在下面的 JSON 示例中,如何找到所有包含字符串 "Choice" 的元素并将它们替换为另一个字符串,例如 "Grade"。 因此,下面所有字段名称“***Choice”应更改为“***Grade”。
我在下面粘贴了预期的输出。鉴于我不知道有多少字段将包含字符串 "Choice",我不想简单地执行直接查找和替换的 [$in ~> | ** [firstChoice] | {"firstGrade": firstChoice}, ["firstChoice"] | ;]
。
{
"data": {
"resourceType": "Bundle",
"id": "e919c820-71b9-4e4b-a1c8-c2fef62ea911",
"firstChoice": "xxx",
"type": "collection",
"entry": [
{
"resource": {
"resourceType": "Condition",
"id": "SMART-Condition-342",
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "38341003",
"display": "Essential hypertension",
"firstChoice": "xxx"
}
],
"text": "Essential hypertension"
},
"clinicalStatus": "active",
"secondChoice": "xxx"
},
"search": {
"mode": "match"
}
}
]
}
}
预期输出
{
"data": {
"resourceType": "Bundle",
"id": "e919c820-71b9-4e4b-a1c8-c2fef62ea911",
"firstGrade": "xxx",
"type": "collection",
"entry": [
{
"resource": {
"resourceType": "Condition",
"id": "SMART-Condition-342",
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "38341003",
"display": "Essential hypertension",
"firstGrade": "xxx"
}
],
"text": "Essential hypertension"
},
"clinicalStatus": "active",
"secondGrade": "xxx"
},
"search": {
"mode": "match"
}
}
]
}
}
可能有更简单的方法,但这是我在 JSONata 中想出的表达式:
(
$prefixes := $keys(**)[$ ~> /Choice$/].$substringBefore('Choice');
$reduce($prefixes, function($acc, $prefix) {(
$choice := $prefix & "Choice";
$acc ~> | ** [$lookup($choice)] | {$prefix & "Grade": $lookup($choice)}, [$choice] |
)}, $$)
)
它看起来很糟糕,但无论如何我都会解释我是如何构建它的。
您从表达式开始
$ ~> | ** [firstChoice] | {"firstGrade": firstChoice}, ["firstChoice"] |
如果你只想替换一个选项,而且你知道全名,这很好。如果要替换多个,则可以按如下方式将它们链接在一起:
$ ~> | ** [firstChoice] | {"firstGrade": firstChoice}, ["firstChoice"] |
~> | ** [secondChoice] | {"secondGrade": secondChoice}, ["secondChoice"] |
~> | ** [thirdChoice] | {"thirdGrade": thirdChoice}, ["thirdChoice"] |
此时,您可以创建一个采用选择前缀和 returns 部分替换的高阶函数(请注意,|...|...|
语法会生成一个函数)。然后,您可以使用内置的 $reduce()
高阶函数将它们链接在一起以获得前缀数组。所以你得到这样的东西:
(
$prefixes := ["first", "second", "third"];
$reduce($prefixes, function($acc, $prefix) {(
$choice := $prefix & "Choice";
$acc ~> | ** [$lookup($choice)] | {$prefix & "Grade": $lookup($choice)}, [$choice] |
)}, $$)
)
但是如果你不知道前面的前缀集,并且想要 select,比如说,所有以 'Choice' 结尾的 属性 名称,下面的表达式会给你的:
$prefixes := $keys(**)[$ ~> /Choice$/].$substringBefore('Choice')
这就是我最后的表达方式。您可以对您的数据进行试验 here in the exerciser。
我知道那是 2019 年,但这里有一个替代解决方案可以帮助未来的读者。
$replace($string(),/([first|second|third])Choice/,"Grade")~>$eval()