合并哈希表
您可以考虑简单地覆盖它们,而不是删除键:
$h1 = @{a = 9; b = 8; c = 7}
$h2 = @{b = 6; c = 5; d = 4}
$h3 = @{c = 3; d = 2; e = 1}
Function Merge-Hashtables {
$Output = @{}
ForEach ($Hashtable in ($Input + $Args)) {
If ($Hashtable -is [Hashtable]) {
ForEach ($Key in $Hashtable.Keys) {$Output.$Key = $Hashtable.$Key}
}
}
$Output
}
对于此 cmdlet,您可以使用多种语法,并且不限于两个输入表:
使用管道:$h1, $h2, $h3 | Merge-Hashtables
使用参数:Merge-Hashtables $h1 $h2 $h3
或组合:$h1 | Merge-Hashtables $h2 $h3
以上所有示例都返回相同的哈希表:
Name Value
---- -----
e 1
d 2
b 6
c 3
a 9
如果提供的哈希表中有任何重复的键,则取最后一个哈希表的值。
(添加于 2017-07-09)
合并哈希表版本 2
一般来说,我更喜欢更多的全局函数,这些函数可以像原始问题一样通过参数自定义特定需求:“如果第二个中存在相同的键,则在第一个中覆盖键值对”。为什么让最后一个推翻而不是第一个?为什么要删除任何东西?也许其他人想要合并或加入这些值或获得最大值或只是平均值......
下面的版本不再支持提供哈希表作为参数(您只能通过管道将哈希表传递给函数),但有一个参数允许您通过操作分配给哈希键的值数组来决定如何处理重复条目中的值数组呈现在当前对象中 ($_)。
功能
Function Merge-Hashtables([ScriptBlock]$Operator) {
$Output = @{}
ForEach ($Hashtable in $Input) {
If ($Hashtable -is [Hashtable]) {
ForEach ($Key in $Hashtable.Keys) {$Output.$Key = If ($Output.ContainsKey($Key)) {@($Output.$Key) + $Hashtable.$Key} Else {$Hashtable.$Key}}
}
}
If ($Operator) {ForEach ($Key in @($Output.Keys)) {$_ = @($Output.$Key); $Output.$Key = Invoke-Command $Operator}}
$Output
}
语法
HashTable[] <Hashtables> | Merge-Hashtables [-Operator <ScriptBlock>]
默认
默认情况下,来自重复哈希表条目的所有值都将添加到数组中:
PS C:\> $h1, $h2, $h3 | Merge-Hashtables
Name Value
---- -----
e 1
d {4, 2}
b {8, 6}
c {7, 5, 3}
a 9
示例
要获得与版本 1 相同的结果(使用 last values),请使用命令:$h1, $h2, $h3 | Merge-Hashtables {$_[-1]}。如果您想改用第一个值,命令为:$h1, $h2, $h3 | Merge-Hashtables {$_[0]} 或最大值:$h1, $h2, $h3 | Merge-Hashtables {($_ | Measure-Object -Maximum).Maximum}。
更多示例:
PS C:\> $h1, $h2, $h3 | Merge-Hashtables {($_ | Measure-Object -Average).Average} # Take the average values"
Name Value
---- -----
e 1
d 3
b 7
c 5
a 9
PS C:\> $h1, $h2, $h3 | Merge-Hashtables {$_ -Join ""} # Join the values together
Name Value
---- -----
e 1
d 42
b 86
c 753
a 9
PS C:\> $h1, $h2, $h3 | Merge-Hashtables {$_ | Sort-Object} # Sort the values list
Name Value
---- -----
e 1
d {2, 4}
b {6, 8}
c {3, 5, 7}
a 9