gpt4 book ai didi

arrays - 如何获取数组中哈希表的索引?

转载 作者:行者123 更新时间:2023-12-03 00:45:16 26 4
gpt4 key购买 nike

我在查找数组中哈希表的索引时遇到了一些麻烦。我用这段代码创建了一个 JSON:

$start = {
Clear-Host
$BIB = Read-Host 'Bibliothek'
$BIBName = Read-Host 'Bibliothek Name'
$Standort = Read-Host 'Bibliothek Standort'
$Autor = Read-Host 'Buchautor'
$BuchName = Read-Host 'Buchname'

$jsonfile = "C:\Skripte\bibV2-1000.xml"
if(![System.IO.File]::Exists($jsonfile)){
$Data = @{BIBs = @(
@{$BIB = @{BIBName=$BIBName},
@{Standort = $Standort},
@{Bücher = @(
@{BuchName = $BuchName;
Autor = $Autor})
}}
)}
ConvertTo-Json -Depth 50 -InputObject $Data | Add-Content $jsonfile
.$continue
} else {
$jsonfile = "C:\Skripte\bibV2-1000.json"
$Data = Get-Content $jsonfile | ConvertFrom-Json
$Data.BIBs += New-Object -TypeName psobject -Property @{$BIB =
@{BIBname=$BIBName},
@{Standort=$Standort},
@{Bücher = @(@{
Buchname=$BuchName;
Autor=$Autor})
}
}
ConvertTo-Json -Depth 50 -InputObject $Data | Out-File $jsonfile}
.$continue
}


$continue = {
Write-Host ""
Write-Host "Was wollen Sie machen?"
Write-Host "(1) Eine weitere Bibliothek hinzufügen"
Write-Host "(2) Einer Bibliothek neue Bücher hinzufügen"
Write-Host "(E) Script beenden"

If (($read = Read-Host ) -eq "1") {
&$start} else {
if (($read) -eq "2") {
. C:\Skripte\büc.ps1 } else {
if (($read) -eq "E") {
exit} else {
Write-Host "+++ FALSCHE EINGABE! Bitte wählen Sie (1) oder (2) für die entsprechende Aktion +++"
.$continue
}
}
}
}
&$start

输出如下:
{
"BIBs": [{
"BIB1": [{
"BIBName": "123"
},
{
"Standort": "123"
},
{
"Bücher": [{
"Autor": "123",
"BuchName": "123"
}]
}
]
},
{
"BIB2": [{
"BIBname": "345"
},
{
"Standort": "345"
},
{
"Bücher": [{
"Autor": "345",
"Buchname": "345"
}]
}
]
}
]
}

现在我想找出“BIB1”的索引。我已经尝试过 IndexOf() 方法,它应该创建输出“0”,但它给了我“-1”,因为它找不到值。如何获得“BIB1”的索引?

最佳答案

根据您的 earlier question ,您正在尝试获取特定对象的索引,以便您可以通过其包含的数组访问它。但是,您可以更直接地执行此操作:$objOfInterest = $Data.BIBs | ? BIB1 - 见我的answer to your earlier question详情。

您需要遍历 $Data.BIBs 的数组元素,其中 - 在使用 ConvertFrom-Json 重新读取您的序列化为文件作为 JSON 哈希表时- 是自定义对象(正如 Ansgar 正确指出的那样;它们是 [System.Management.Automation.PSCustomObject] 的实例),并检查每个对象是否存在属性 'BIB1' :

  • (在哈希表中,您将使用 'BIB1' 检查 key .ContainsKey('BIB1') 的存在)
  • 要测试对象属性的存在,您需要反射,这最容易——但有些晦涩——通过隐藏的 .PSObject 实现。属性,如 Ansgar Wiechers' more elegant solution 中所示.

  • 然而,鉴于感兴趣的属性具有非空值,我们可以使用隐式 bool (逻辑)从非空值的存在推断出给定属性存在: $obj.'BIB1'默认返回 $null如果没有 BIB1属性,在诸如 if 的 bool 上下文中是“假的”有条件的;相反,任何非空值都是“真实的”:
    $propName = 'BIB1'
    $i = $ndx = -1
    foreach ($obj in $Data.BIBs) {
    ++$i
    if ($obj.$propName) { $ndx = $i; break}
    }
    $ndx # $ndx now contains the index of the target object or -1 if there was no match

    关于arrays - 如何获取数组中哈希表的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49383137/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com