PowerShell: วิธีรวมตารางแฮชหลายรายการ
บ่อยครั้งที่คุณอาจต้องการรวมตารางแฮชหลายตารางลงในตารางแฮชเดียวใน PowerShell
คุณสามารถใช้วิธีการต่อไปนี้เพื่อดำเนินการดังกล่าว:
วิธีที่ 1: รวมตารางแฮช (โดยไม่มีคีย์ที่ซ้ำกัน)
$new_hash = $hash1 + $hash2ตัวอย่างนี้รวมตารางแฮชชื่อ $hash1 และ $hash2 เข้ากับตารางแฮชใหม่ชื่อ $new_hash
วิธีนี้ใช้ได้เฉพาะในกรณีที่ไม่มีคีย์ที่ซ้ำกันระหว่างตารางแฮชทั้งสอง
วิธีที่ 2: รวมตารางแฮช (ด้วยคีย์ที่ซ้ำกัน)
Function CombineHash([ScriptBlock]$Operator) {
$Out = @{}
ForEach ($h in $Input) {
If ($h -is [Hashtable]) {
ForEach ($Key in $h.Keys) {$Out.$Key = If ($Out.ContainsKey($Key)) {@($Out.$Key) + $h.$Key} Else {$h.$Key}}
}
}
If ($Operator) {ForEach ($Key in @($Out.Keys)) {$_ = @($Out.$Key); $Out.$Key = Invoke-Command $Operator}}
$Out
}
$hash1, $hash2 | CombineHash
ตัวอย่างนี้สร้างฟังก์ชันชื่อ CombineHash ที่ยอมรับรายการตารางแฮชที่ไพพ์เข้าไปและรวมตารางแฮชให้เป็นตารางแฮชเดียว
หากมีคีย์ที่ซ้ำกันระหว่างตารางแฮช คีย์เดียวจะแสดงในตารางแฮชรวมและค่าจะถูกเพิ่มลงในอาร์เรย์
เมื่อใช้ฟังก์ชันนี้ คุณยังสามารถใช้พารามิเตอร์ $Operator ของฟังก์ชันเพื่อระบุวิธีจัดการค่าจากคีย์ที่ซ้ำกัน
ตัวอย่างต่อไปนี้แสดงวิธีการใช้แต่ละวิธีในทางปฏิบัติ
ตัวอย่างที่ 1: รวมตารางแฮช (โดยไม่มีคีย์ที่ซ้ำกัน)
เราสามารถใช้โค้ดต่อไปนี้เพื่อรวมตารางแฮชสองตารางชื่อ $hash1 และ $hash2 ที่ไม่มีคีย์ที่ซ้ำกัน:
$hash1 = @{A=5; B=10; C=15}
$hash2 = @{D=20; E=25; F=30}
$new_hash = $hash1 + $hash2ภาพหน้าจอต่อไปนี้แสดงวิธีใช้ไวยากรณ์นี้ในทางปฏิบัติ:
ผลลัพธ์ที่ได้คือตารางแฮชเดี่ยวชื่อ $new_hash ที่รวมค่าจากทั้ง $hash1 และ $hash2
ตัวอย่างที่ 2: รวมตารางแฮช (ด้วยคีย์ที่ซ้ำกัน)
เราสามารถสร้างฟังก์ชันต่อไปนี้ชื่อ CombineHash เพื่อรวมตารางแฮชเข้าด้วยกันซึ่งอาจมีคีย์ที่ซ้ำกัน:
Function CombineHash([ScriptBlock]$Operator) {
$Out = @{}
ForEach ($h in $Input) {
If ($h -is [Hashtable]) {
ForEach ($Key in $h.Keys) {$Out.$Key = If ($Out.ContainsKey($Key)) {@($Out.$Key) + $h.$Key} Else {$h.$Key}}
}
}
If ($Operator) {ForEach ($Key in @($Out.Keys)) {$_ = @($Out.$Key); $Out.$Key = Invoke-Command $Operator}}
$Out
}
จากนั้นเราสามารถใช้โค้ดต่อไปนี้เพื่อสร้างตารางแฮชสองตารางที่ใช้คีย์ที่ซ้ำกันและใช้ฟังก์ชัน CombineHash เพื่อรวมเป็นตารางแฮชเดียว:
$hash1 = @{A=5; B=10; C=15}
$hash2 = @{A=20; B=25; F=30}
$hash1, $hash2 | CombineHashภาพหน้าจอต่อไปนี้แสดงวิธีใช้ไวยากรณ์นี้ในทางปฏิบัติ:
ตารางแฮชแบบรวมมีค่าจากตารางแฮชดั้งเดิมทั้งสอง โดยมีค่าที่ใช้คีย์ร่วมกันซึ่งจัดกลุ่มเป็นอาร์เรย์
คุณยังสามารถใช้ไวยากรณ์ต่อไปนี้เพื่อส่งคืนค่าเฉลี่ยของคีย์ที่ซ้ำกัน:
$hash1 = @{A=5; B=10; C=15}
$hash2 = @{A=20; B=25; F=30}
$hash1, $hash2 | CombineHash {($_ | Measure-Object -Average).Average}ภาพหน้าจอต่อไปนี้แสดงวิธีใช้ไวยากรณ์นี้ในทางปฏิบัติ:
ขณะนี้ค่าที่แสดงในคอลัมน์ ค่า แสดงถึงค่าเฉลี่ยระหว่างคีย์ที่ซ้ำกัน
คุณสามารถแทนที่ ค่าเฉลี่ย ด้วย ผลรวม สูงสุด ขั้นต่ำ ฯลฯ เพื่อส่งกลับค่ารวมอื่นแทน


