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

如何用表达式扁平化嵌套PowerShell对象并精准过滤指定项?

PowerShell嵌套对象扁平化与过滤问题解决

首先给出原始嵌套对象定义:

$nested=[pscustomobject]@{set="A"; lst=[pscustomobject]@{Id=1; Name="One"},[pscustomobject]@{Id=2; Name="Two"}} `
        , [pscustomobject]@{set="B"; lst=[pscustomobject]@{Id=1; Name="One"},[pscustomobject]@{Id=3; Name="Three"}}

一、实现扁平化列表

无需过程式循环结构,可通过ForEach-Object结合Select-Object的计算属性实现扁平化:

$nested | ForEach-Object {
    $currentSet = $_.set
    $_.lst | Select-Object @{Name='Set'; Expression={$currentSet}}, Id, Name
}

执行后会直接输出目标扁平化结果:

Set Id Name
--- -- -----
A   1  One
A   2  Two
B   1  One
B   3  Three

原理是遍历每个顶层对象,提取当前set值,再将lst中的每个子对象与set值组合成新对象,完成扁平化。

二、过滤指定条目

你之前的写法会返回整个包含符合条件子对象的顶层对象,原因是$_.lst.Id是数组,只要数组中有一个元素满足-eq 2,整个顶层对象就会被保留。正确的做法是先扁平化(或在展开时过滤),再筛选目标条目:

方法1:先扁平化再过滤

$nested | ForEach-Object {
    $currentSet = $_.set
    $_.lst | Select-Object @{Name='Set'; Expression={$currentSet}}, Id, Name
} | Where-Object { $_.Id -eq 2 -and $_.Name -eq 'Two' }

方法2:展开时直接过滤

$nested | ForEach-Object {
    $currentSet = $_.set
    $_.lst | Where-Object { $_.Id -eq 2 -and $_.Name -eq 'Two' } | Select-Object @{Name='Set'; Expression={$currentSet}}, Id, Name
}

两种方法都会输出你需要的结果:

Set Id Name
--- -- -----
A   2  Two

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 10:36:01