我正在尋找一種使用 PowerShell 過濾嵌套物件的方法。假設我有一個包含 UPN 地址的串列。
$UPN = "[email protected]", "[email protected]"
在下面轉換為 JSON 的物件中,我只想獲取整個物件中的“Attr1”包含上述串列中的任何地址的那些物件。
[
{
"Id": "1",
"Name": "XYZ",
"Attr1": [
{
"Id": "1",
"UPN": "[email protected]"
},
{
"Id": "2",
"UPN": "[email protected]"
},
{
"Id": "3",
"UPN": "[email protected]"
}
],
"Attr2": [
{
"Id": "1",
[...]
}
],
"Attr3": [
{
"Id": "1",
[...]
},
{
"Id": "2",
[...]
}
]
},
{
"Id": "2",
"Name": "XYZ",
"Attr1": [
{
"Id": "1",
"UPN": "[email protected]"
}
],
"Attr2": [
],
"Attr3": [
{
"Id": "1",
[...]
}
]
}
]
如何過濾這樣的物件?對我不起作用的標準方法(我沒有得到想要的結果,丟失資料):
$CollectionOfObjects | Where-Object {$_.Attr1.UPN -in $UPN}
如何處理?
問候!
uj5u.com熱心網友回復:
您需要嵌套 Where-Object呼叫以獲得所需的結果,或者,為了使用記憶體集合獲得更好的性能,方法呼叫:.Where()
$CollectionOfObjects.Where({ $_.Attr1.Where({ $_.UPN -in $UPN }, 'First') })
尖帽子的曼努埃爾Batsching對他的幫助。
注意:該'First'引數不是絕對必要的,但可以提高性能,.Attr1因為一旦找到匹配項,它就會停止列舉陣列的元素。
順便說一句:Where-Object有沒有等效特點-列舉總是不斷。
GitHub 問題 #13834建議也將所有額外的功能.Where()支持引入Where-Object。
一個包含簡化資料的獨立示例:
$UPN = '[email protected]', '[email protected]'
$CollectionOfObjects = ConvertFrom-Json @'
[
{
"Id": "1",
"Name": "XYZ1",
"Attr1": [
{
"Id": "1",
"UPN": "[email protected]"
},
{
"Id": "2",
"UPN": "[email protected]"
},
{
"Id": "3",
"UPN": "[email protected]"
}
],
"Attr2": [ ],
"Attr3": [ ]
},
{
"Id": "2",
"Name": "XYZ2",
"Attr1": [
{
"Id": "1",
"UPN": "[email protected]"
},
{
"Id": "2",
"UPN": "[email protected]"
}
],
"Attr2": [ ],
"Attr3": [ ]
},
{
"Id": "3",
"Name": "XYZ3",
"Attr1": [
{
"Id": "1",
"UPN": "[email protected]"
}
],
"Attr2": [ ],
"Attr3": [ ]
}
]
'@
$CollectionOfObjects.Where({ $_.Attr1.Where({ $_.UPN -in $UPN }, 'First') })
輸出,顯示成功識別了兩個感興趣的物件:
Id : 1
Name : XYZ1
Attr1 : {@{Id=1; [email protected]}, @{Id=2; [email protected]}, @{Id=3; [email protected]}}
Attr2 : {}
Attr3 : {}
Id : 3
Name : XYZ3
Attr1 : {@{Id=1; [email protected]}}
Attr2 : {}
Attr3 : {}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/358617.html
標籤:电源外壳
