如何深入比较地图以过滤 XQuery 中的不同项目?
How to deep compare maps to filter distinct items in XQuery?
我希望我可以过滤地图列表以删除相同的地图。
XQuery 的union
运算符只对节点有效。
如何深入比较地图以输出不同的地图?我可以假设函数 deep-equal()
可以在那里使用高阶函数,但我无法应付它。
let $map1 := map{
'a' : '1',
'b' : '2'
}
let $map2 := map{
'c' : '3',
'd' : '4'
}
let $map3 := map{
'a' : '1',
'b' : '2'
}
return local:getDistinctMap( ($map1, $map2, $map3) )
应该return
map{
'a' : '1',
'b' : '2'
}
map{
'c' : '3',
'd' : '4'
}
您可以使用 fold-left
:
declare function local:getDistinctMaps($maps as map(*)*) as map(*)* {
fold-left(
$maps,
(),
function($distinct-maps, $new-map) {
if (some $map in $distinct-maps satisfies deep-equal($map, $new-map))
then $distinct-maps else ($distinct-maps, $new-map)
}
)
};
let $map1 := map{
'a' : '1',
'b' : '2'
}
let $map2 := map{
'c' : '3',
'd' : '4'
}
let $map3 := map{
'a' : '1',
'b' : '2'
}
return local:getDistinctMaps( ($map1, $map2, $map3) )
我希望我可以过滤地图列表以删除相同的地图。
XQuery 的union
运算符只对节点有效。
如何深入比较地图以输出不同的地图?我可以假设函数 deep-equal()
可以在那里使用高阶函数,但我无法应付它。
let $map1 := map{
'a' : '1',
'b' : '2'
}
let $map2 := map{
'c' : '3',
'd' : '4'
}
let $map3 := map{
'a' : '1',
'b' : '2'
}
return local:getDistinctMap( ($map1, $map2, $map3) )
应该return
map{
'a' : '1',
'b' : '2'
}
map{
'c' : '3',
'd' : '4'
}
您可以使用 fold-left
:
declare function local:getDistinctMaps($maps as map(*)*) as map(*)* {
fold-left(
$maps,
(),
function($distinct-maps, $new-map) {
if (some $map in $distinct-maps satisfies deep-equal($map, $new-map))
then $distinct-maps else ($distinct-maps, $new-map)
}
)
};
let $map1 := map{
'a' : '1',
'b' : '2'
}
let $map2 := map{
'c' : '3',
'd' : '4'
}
let $map3 := map{
'a' : '1',
'b' : '2'
}
return local:getDistinctMaps( ($map1, $map2, $map3) )