【问题标题】:Get key name in one member hashtable获取一个成员哈希表中的键名
【发布时间】:2019-11-17 18:47:56
【问题描述】:

我有一个多级查找表的数据结构,看起来像这样

$lookupTable = @{
    'a' = @{
        'a1' = 'A One'
        'a2' = 'A Two'
        'a3' = 'A Three'
    }
    'b' = @{
        'b1' = 'B One'
        'b2' = 'B Two'
        'b3' = 'B Three'
    }
}

我使用这样的数据结构来传递任意数量的新值和修改值来更新表,就像这样。

$hash=@{'a'=@{'a4'='A Four'}
        'b'=@{'b4'='B Four'}
        'c'=@{'c1'='C One'
              'c2'='C Two'
             }
       }

然后我可以使用嵌套的 foreach 循环来获取要添加或更新的键名。

但是,我还需要只提取一个值,并且我想保留一个类似的数据结构,这样我就可以只传递一个哈希表来准确指定我要查找的值,例如$getValue = @{'b'='b1'}

但要做到这一点,我需要在第一个(唯一)索引处获取键名。我试过了

Write-Host "$($getValue.GetEnumerator[0])"
Write-Host "$($getValue.keys.GetEnumerator[0])"
Write-Host "$($getValue.GetEnumerator[1])"
Write-Host "$($getValue.keys.GetEnumerator[1])"

没有任何工作。我可以再次使用 foreach,它只会看一次,但这似乎不优雅。那么,我做错了什么?

编辑:只是为了验证基于循环的方法是否有效,我这样做了

foreach ($key in $getValue.keys) {
    if ($key) {
        Write-Host "$key $($getValue.$key) = $($lookupTable.$key.($getValue.$key))"
    }
    break
}

它确实以 b b1 = B one 返回。但是这样做的方式多么丑陋。

当,越来越近了! $key = $getValue.keys[0] 确实提供了 b 键。但是$value = $getValue.$key 没有按预期返回 b1。但是,$value = $getValue[$key] 可以!但是,然后尝试 $key = $getValue.keys[0] $value = $getValue[$key]

Write-Host "$key $($getValue[$key]) = $($lookupTable.$key.$value)"

不会返回实际的最终值。 Grr。再来点咖啡,然后再试一次。

啊哈! $getValue.keys[0] 不返回字符串。但是如果你转换成一个字符串,那么一切都是花花公子。所以

$key = [string]$getValue.keys[0]
$value = $getValue.$key
Write-Host "$key $value = $($lookupTable.$key.$value)"

很享受。所以我回答了我自己的问题。我想我会让模组决定这是否对其他人具有教育意义,或者应该被删除。

【问题讨论】:

    标签: powershell hashtable


    【解决方案1】:

    我认为你可以通过将$getValue 声明为一个简单的数组而不是哈希表来简化这一点:

    # define the value to get as array of keys. 
    # Element 0 => the key for $lookupTable, 
    # Element 1 => the key for the first nested hash
    $getValue = 'b','b1'
    
    # now, simply get the value you are looking for like this:
    Write-Host $lookupTable[$getvalue[0]][$getValue[1]]
    
    # or like so:
    Write-Host $lookupTable.$($getvalue[0]).$($getvalue[1])
    
    # or by using helper variables:
    $lookupKey, $nestedKey = $getValue
    Write-Host $lookupTable.$lookupKey.$nestedKey
    

    以上所有都将返回值B One

    【讨论】:

    • 确实,在过去的几个小时里我得出了同样的结论。但我确实学到了一些关于哈希表的知识,让它以另一种方式工作,所以这也很好。现在也将其应用到生产代码中。
    猜你喜欢
    • 2011-06-28
    • 2012-09-01
    • 2016-06-10
    • 2018-05-29
    • 2021-09-21
    • 2014-01-30
    • 2019-12-09
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多