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 的内容送入管道,再对这些子对象筛选。
备注:内容仅供参考。
