如何避免在 MarkLogic 中将地图作为参考传递?

How to avoid passing of map as reference in MarkLogic?

我正在使用 ML 8.0-8

有什么方法可以不将 Map 传递给函数作为引用。

我的意思是,如果我在函数中的地图中进行任何更新,它不应反映在实际地图中。

示例:

function call($map as map:map) {
     'add one more key in the $map'
}

declare $actualMap
call($actualMap)
print $actualMap

调用函数中的更新不应反映在 $actualMap

您基本上必须克隆它。您可以在 XQuery 中使用 one-liner 序列化和解析它来做到这一点:

let $clonedMap := map:map(document{ $map }/*)

请注意,map:map 可能包含无法序列化的项目,例如函数引用。在这种情况下,您需要重建 map:map。例如:

let $clonedMap := map:new(map:keys($map) ! map:entry(., map:get($map, .)))

第二种方法实际上可能更快,但它不会递归处理 map:map,而第一种方法会。您可以将第二个包装在递归函数中,并使用类型开关进行补偿。

HTH!