You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell如何筛选Attr1含指定UPN列表值的嵌套对象

PowerShell嵌套对象筛选的正确实现

你原有筛选逻辑失效的核心原因是,当$_.Attr1为空数组、或包含null值时,直接调用$_.Attr1.UPN -in $UPN的返回值可能不是预期的布尔值,导致筛选器判断错误丢失数据。以下是两种适配不同场景的正确写法:

方案1:简洁写法(适合小规模数据)

直接在筛选脚本块中显式校验匹配结果的存在性,利用布尔隐式转换返回判断结果:

$CollectionOfObjects | Where-Object {
    # 只要Attr1中存在任意一个UPN在目标列表中就保留当前对象
    [bool]($_.Attr1.UPN -in $UPN)
}

如果需要兼容更低版本的PowerShell,也可以写成:

$CollectionOfObjects | Where-Object {
    ($_.Attr1 | ForEach-Object { $_.UPN }) -in $UPN
}

方案2:高性能写法(适合大规模数据)

当UPN列表或待筛选对象集合规模较大时,优先用哈希集合做O(1)级别的查找,大幅提升筛选效率:

# 初始化不区分大小写的哈希集合存储目标UPN
$upnLookup = [System.Collections.Generic.HashSet[string]]::new($UPN, [StringComparer]::OrdinalIgnoreCase)
$CollectionOfObjects | Where-Object {
    foreach ($attrItem in $_.Attr1) {
        if ($upnLookup.Contains($attrItem.UPN)) {
            # 匹配到就直接返回true,不需要遍历剩余项
            return $true
        }
    }
    return $false
}

效果验证

针对你提供的示例数据,两种写法都会正确筛选出Id = 1的对象,符合「Attr1包含目标UPN列表中任意地址」的筛选要求。


内容的提问来源于stack exchange,提问作者anders1990

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:36:03