Private/Core/ConvertTo-TcHashtable.ps1

function ConvertTo-TcHashtable {
    <#
    .SYNOPSIS
    Turns nested objects into ordered dictionaries and arrays.
    #>

    [CmdletBinding()]
    param(
        [AllowNull()]$InputObject
    )

    if ($null -eq $InputObject) { return $null }

    if ($InputObject -is [System.Collections.IDictionary]) {
        $copy = [ordered]@{}
        foreach ($key in @($InputObject.Keys)) { $copy[$key] = ConvertTo-TcHashtable -InputObject $InputObject[$key] }
        return $copy
    }

    if ($InputObject -is [string] -or $InputObject.GetType().IsValueType) { return $InputObject }

    if ($InputObject -is [System.Collections.IEnumerable]) {
        return , @($InputObject | ForEach-Object { ConvertTo-TcHashtable -InputObject $_ })
    }

    if ($InputObject -is [psobject]) {
        $copy = [ordered]@{}
        foreach ($property in $InputObject.PSObject.Properties) { $copy[$property.Name] = ConvertTo-TcHashtable -InputObject $property.Value }
        return $copy
    }

    $InputObject
}