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

如何查询Hashtable嵌套属性?求无需迭代提取Bar属性数组的方法

获取嵌套哈希表中所有Bar属性的数组(PowerShell)

当然有更简洁的实现方式!你当前的嵌套循环虽然能达成目标,但PowerShell的原生特性可以帮你彻底省去手动迭代的麻烦,下面给你几种实用的解决方案:

1. 最简洁:直接使用成员访问语法

PowerShell支持对集合的批量成员访问,无需任何循环或管道,一行就能搞定:

$ht.Values.Bar

原理:

  • $ht.Values会返回哈希表中所有内层哈希表的集合(也就是@{Bar="Baz"; Qux="Quux"}和@{Bar="Corge"; Qux="Grault"})
  • 直接对这个集合访问.Bar,PowerShell会自动遍历每个元素提取Bar属性,最终返回一个包含所有值的数组。

2. 管道+ForEach-Object(可读性强)

如果你更习惯管道风格的写法,可以用GetEnumerator()配合ForEach-Object:

$ht.GetEnumerator() | ForEach-Object { $_.Value.Bar }

原理:

  • GetEnumerator()获取哈希表的键值对枚举器,每个枚举项包含Key(外层键名,比如Foo、Quuz)和Value(内层哈希表)
  • 通过ForEach-Object遍历每个枚举项,直接提取Value中的Bar属性,最终自动收集为数组。

3. 结合Select-Object的实现(呼应你提到的思路)

如果你想用Select-Object来处理,可以先展开内层哈希表,再提取属性:

($ht.GetEnumerator() | Select-Object -ExpandProperty Value).Bar

或者用计算属性的方式:

$ht.GetEnumerator() | Select-Object @{Name='Bar'; Expression={$_.Value.Bar}} | Select-Object -ExpandProperty Bar

原理:

  • 第一种写法先通过-ExpandProperty Value提取所有内层哈希表,再批量访问.Bar属性
  • 第二种写法用计算属性先定义Bar字段,再通过-ExpandProperty把字段值展开为数组。

顺便优化你原来的代码

其实你原来的内层循环是多余的,$i已经是哈希表的键值对枚举项,直接访问$i.Value.Bar即可,简化后:

$arr = @()
foreach ($entry in $ht.GetEnumerator()) {
    $arr += $entry.Value.Bar
}

不过显然还是前面几种方法更高效简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:20:59