Private/Remove-NullProperties.ps1

# Remove-NullProperties.ps1
# Recursively removes null values from hashtables and arrays before JSON output.
# Part of the M365-QuickAssess module -- not exported.

function Remove-NullProperties
{
    param ( $Object )

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

    if ( $Object -is [System.Management.Automation.PSCustomObject] )
    {
        $new = [ordered]@{}
        foreach ( $prop in $Object.PSObject.Properties )
        {
            if ( $null -eq $prop.Value ) { continue }
            $value = Remove-NullProperties -Object $prop.Value
            if ( $null -ne $value ) { $new[$prop.Name] = $value }
        }
        return $new
    }

    if ( $Object -is [System.Collections.IDictionary] )
    {
        $new = [ordered]@{}
        foreach ( $key in $Object.Keys )
        {
            if ( $null -eq $Object[$key] ) { continue }
            $value = Remove-NullProperties -Object $Object[$key]
            if ( $null -ne $value ) { $new[$key] = $value }
        }
        return $new
    }

    if ( $Object -is [System.Collections.IEnumerable] -and -not ( $Object -is [string] ) )
    {
        $newArray = @()
        foreach ( $item in $Object )
        {
            if ( $null -eq $item ) { continue }
            $cleanItem = Remove-NullProperties -Object $item
            if ( $null -ne $cleanItem ) { $newArray += $cleanItem }
        }
        return $newArray
    }

    return $Object
}