PAYATHON 2026

PowerShell 如何展平嵌套对象并筛选指定子对象?

数据小许

结论

对每个父对象,使用 ForEach-Object 处理其中的 lst,再用 Select-Object 添加父对象的 set 值,并选出 Id 和 Name,就能得到展平后的结果。筛选条件应作用于 lst 中的子对象。若对父对象使用 Where-Object,输出的仍是整个父对象及其完整列表。

假设 $nested 是题目中的对象数组:

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

输出包含四行记录,列为 Set、Id 和 Name:

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

$set 保存当前父对象的 set 值。Select-Object 的计算属性会把它写入每条子对象记录的 Set 列,同时选出子对象自身的 Id 和 Name。这里使用的是管道中的 ForEach-Object,而不是显式的 foreach 循环语句。

只筛选指定的子对象

在处理 lst 的管道中使用 Where-Object,然后添加父对象的 Set 列:

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

结果是一行记录:Set 为 A、Id 为 2、Name 为 Two。

原来的表达式:

$nested | Where-Object { $_.lst.Id -eq 2 }

检查父对象的 lst 中是否有 Id 满足条件的子对象。条件成立时,输出的还是父对象,因此整个 lst 都会保留。要只返回匹配的子对象,先把 lst 的内容送入管道,再对这些子对象筛选。

备注:内容仅供参考。