如何在Jsonata中基于布尔表达式条件渲染属性?
在JSONata中基于布尔表达式动态控制属性渲染的解决方案
完全可以实现你的需求,先帮你分析下原有代码的问题,再给出两种可行的实现方式:
原有代码的问题
- 拼写错误:你写的
listToExlude少了一个字母c,正确的应该是listToExclude,这会直接导致条件判断失效; - 属性处理逻辑错误:
name[$not(id in $$.listToExclude)]这种写法,当条件不满足时会生成空数组[],而不是直接移除name属性,不符合你的预期。
可行实现方式
方式一:对象合并+条件判断
通过创建基础对象,再根据条件选择性合并属性的方式实现:
{ "objs": $.objs.( { "id": id } & ($not(id in $$.listToExclude) ? { "name": name } : {}) ) }
逻辑说明:遍历objs中的每个对象,先构建包含id的基础对象;如果当前对象的id不在排除列表中,就合并name属性,否则合并空对象(不添加任何额外属性)。
方式二:Transform操作符结合$undef()
利用JSONata的Transform操作符,配合$undef()来移除不符合条件的属性:
{ "objs": ($.objs ~>|$|{ "name": $not(id in $$.listToExclude) ? name : $undef() }|;) }
逻辑说明:使用Transform操作符遍历每个对象,当id不在排除列表时保留name属性值,否则将属性值设为$undef()——JSONata会自动移除值为undefined的属性,同时注意修正拼写错误listToExclude。
两种方式都能得到你期望的输出结果:
{ "objs": [ { "id": 1, "name": "name1" }, { "id": 2 } ] }
内容的提问来源于stack exchange,提问作者Skatinima
相关产品推荐
相关产品推荐

