ค้นหาเว็บไซต์

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}

ภาพหน้าจอต่อไปนี้แสดงวิธีใช้ไวยากรณ์นี้ในทางปฏิบัติ:

ขณะนี้ค่าที่แสดงในคอลัมน์ ค่า แสดงถึงค่าเฉลี่ยระหว่างคีย์ที่ซ้ำกัน

คุณสามารถแทนที่ ค่าเฉลี่ย ด้วย ผลรวม สูงสุด ขั้นต่ำ ฯลฯ เพื่อส่งกลับค่ารวมอื่นแทน

บทความที่เกี่ยวข้อง