在 zsh 关联数组中迭代键(或 k/v 对)?

在 zsh 关联数组中迭代键(或 k/v 对)?

在 zsh 中,我想迭代关联数组。我需要键和值。但是当我正常迭代关联数组时 ( for x in $assoc_array),我仅获得值。

我看过的所有例子都表明,给定一个密钥,您可以从关联数组中获取其值。我的问题是首先获取一组键。

zsh 是否支持迭代关联数组中的键?

答案1

你可以通过这个漂亮的参数扩展同时获取键和值:

for key val in "${(@kv)assoc_array}"; do
    echo "$key -> $val"
done

参数扩展标志在 Zsh 手册中。

答案2

我问完问题后继续搜索,发现这个答案在 Unix StackExchange 上:

typeset -A assoc_array
assoc_array=(k1 v1 k2 v2 k3 v3)

for k in "${(@k)assoc_array}"; do
  echo "$k -> $assoc_array[$k]"
done

输出为:

k1 -> v1
k2 -> v2
k3 -> v3

答案3

除了以下可接受的答案外,

for key val in "${(@kv)assoc_array}"; do
   echo "$key -> $val"
done

如果你还想按键按升​​序对结果进行排序,你可以这样做

for key in "${(@kon)assoc_array}"; do
   echo "$key -> ${(@v)assoc_array[$key]}"
done

我通常使用后一种形式,因为它允许在循环中进行更多操作,如排序、过滤等。

相关内容