Получить имя ключа в хеш-таблице одного члена - PullRequest
0 голосов
/ 08 июля 2019

У меня есть структура данных для многоуровневой справочной таблицы, которая выглядит примерно так

$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 единица.но какой уродливый способ сделать это.

Черт, все ближе!$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)"

доставляет удовольствие.Поэтому я ответил на свой вопрос.Думаю, я позволю модам решить, может ли это быть полезным для других или просто должно быть удалено.

1 Ответ

0 голосов
/ 08 июля 2019

Я думаю, вы можете упростить это, объявив $getValue не как Hashtable, а как простой массив:

# 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...