0

我希望我可以过滤地图列表以删除相同的地图。

unionXQuery的运算符仅适用于节点。这

如何对地图进行深度比较以输出不同的地图?我可以假设该函数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'
}
4

1 回答 1

1

您可以使用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) )
于 2020-07-11T06:24:10.040 回答