Filter 如何在XQuery中深入比较映射以过滤不同的项?

Filter 如何在XQuery中深入比较映射以过滤不同的项?,filter,maps,xquery,deepequals,Filter,Maps,Xquery,Deepequals,我希望我可以过滤一个地图列表,删除那些相同的 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

我希望我可以过滤一个地图列表,删除那些相同的

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) )
这应该会回来

map{ 
  'a' : '1',
  'b' : '2'
}
map{ 
  'c' : '3',
  'd' : '4'
}

您可以使用左折:

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) )

那当然会很贵。如果有很多这样的映射,并且您需要更高效的解决方案,那么您需要编写一个函数,为每个映射计算某种哈希代码,因此您只需要对哈希代码相等的映射进行深入比较。非常感谢精度。我可以想象这就是为什么地图上不能使用联合运算符的原因