如何访问嵌套在 PSCustomObject 内的数组的元素?

问题描述 投票:0回答:2

以下对象是一个玩具示例,用于说明我的问题:

$food = @(
    [PSCustomObject]@{Category = "Fruits"; Items = @("Mango", "Pineapple", "Orange", "Tangerine")},
    [PSCustomObject]@{Category = "Cities"; Items = @("Abidjan", "Douala")},
    [PSCustomObject]@{Category = "Animals"; Items = @("Dog", "Bird", "Cat")}
)

$food

Category Items
-------- -----
Fruits   {Mango, Pineapple, Orange, Tangerine}
Cities   {Abidjan, Douala}
Animals  {Dog, Bird, Cat}

例如,我想访问

"Fruits"
类别的所有项目。我尝试首先确定
"Fruits"
属性中
Category
的索引,然后在
"Items"
属性中使用它。我以为会返回整个水果名称数组;然而,它并没有按预期工作:

$i = $food.Category.IndexOf("Fruits")
$food[$i]
$food.Items[$i]

Mango

我该怎么办?

谢谢你。

arrays powershell object subset
2个回答
0
投票

您需要将索引

$i
应用于
$food
数组本身:

$food[$i].Items

但是,更符合 PowerShell 习惯的解决方案是:

($food | Where-Object Category -eq Fruits).Items

0
投票

您需要循环遍历

$food
数组中的每个元素,以查找具有
Category
等于
Fruits
属性的对象,然后展开
Items
属性。 PowerShell 中最常用的 3 种过滤技术是:

  1. Where-Object

    $food | Where-Object Category -EQ Fruits |
       ForEach-Object Items
    
  2. .Where
    方法

    $food.Where({ $_.Category -eq 'Fruits' }).Items
    
  3. 带有

    foreach
    条件的经典
    if
    循环:

    foreach ($item in $food) {
        if ($item.Category -eq 'Fruits') {
            $item.Items
        }
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.