试图将两个哈希表与嵌套表和/或数组合并。我发现发布了Merging hashtables in Powershell: how?,这导致我创建了以下函数,以修改帖子中找到的sonjz代码,并且该代码可以很好地与非嵌套对象一起使用,但是当涉及父表中的嵌套表和数组时,它无法正确合并。
如何更新此代码以输出哈希表与嵌套表和/或数组(如果存在)的合并?
Function Merge-HashTables
{
[CmdletBinding(ConfirmImpact = 'Low',
PositionalBinding = $true)]
[OutputType([hashtable])]
param
(
[Parameter(Mandatory = $true,
Position = 0)]
[ValidateNotNullOrEmpty()]
[hashtable]$BaseTable,
[Parameter(Mandatory = $true,
Position = 1)]
[ValidateNotNullOrEmpty()]
[hashtable]$NewTable
)
Begin
{
[hashtable]$Base = $BaseTable.Clone()
}
Process
{
foreach ($Key in $NewTable.Keys)
{
if ($Base.ContainsKey($Key))
{
$Base.Remove($Key)
}
}
Write-Output ($Base + $NewTable)
}
}
答案 0 :(得分:0)
当合并中的键冲突时,现在您只是丢弃一个而保留另一个,因此,如果实际上它们是两个不同的对象,则您总是会丢失一些信息。对于那些对象本身是哈希表或数组的情况,这当然仍然成立,因此,要处理此问题,必须确定要使用特殊合并逻辑处理的类型。
对于哈希表,您可以递归调用自己的函数。您将需要一个level参数来限制可以递归和/或处理循环引用的距离。
对于数组,您可以将它们添加在一起。
要确定对象是否属于某种类型,请使用..../dashboard%2Fus
运算符。
当值的类型不同时,这将变得更加复杂,例如其中一个是-is
,而其中一个是[hashtable]
。您如何结合这些?
您可能还希望处理更多类型的词典和集合以进行组合,在这种情况下,您可以将[string]
运算符用于接口,例如:
-is
与if ($NewTable[$Key] -is [System.Collections.IDictionary]) {
# handle combining dictionaries
}
等类似。
如果此功能的范围非常有限,并且可以对期望值中的值进行假设,那么可能会更轻松,这实际上取决于您的用例。