Merge-Hashtables
Вместо удаления ключей вы можете просто перезаписать их:
$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
}
Для этого командлета вы можете использовать несколько синтаксисов и не ограничиваться двумя входными таблицами: Использование конвейера: $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)
Merge-Hashtables version 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 (с использованием последние значения ), используйте команду: $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