You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关联数组分组遍历问题:按键首数字分组传递给函数fn的实现方案

以下是Bash环境下的实现方案,兼容Bash 4.0及以上版本:

实现逻辑

  1. 先提取所有键名横杠前的前缀,去重得到所有分组编号
  2. 遍历每个分组编号,筛选出对应前缀的所有数组元素,传入目标函数fn

代码实现

基础版本(兼容性好,全版本Bash4+可用)

# 1. 提取所有唯一的分组前缀
declare -A prefix_map
for key in "${!asc[@]}"; do
    # 截取横杠前的分组编号
    group_id="${key%%-*}"
    prefix_map["$group_id"]=1
done

# 2. 按分组遍历调用fn
for group_id in "${!prefix_map[@]}"; do
    # 收集当前分组的所有元素
    group_elements=()
    for key in "${!asc[@]}"; do
        [[ "$key" == "${group_id}-"* ]] && group_elements+=("${asc[$key]}")
    done
    # 传入所有元素调用fn,双引号避免元素含空格/特殊字符时拆分错误
    fn "${group_elements[@]}"
done

优化版本(仅遍历1次原数组,Bash4.3+支持)

使用nameref特性实现分组存储,避免二次遍历原数组,性能更好,同时完美兼容带特殊字符的元素值:

declare -A group_list
for key in "${!asc[@]}"; do
    group_id="${key%%-*}"
    group_list["$group_id"]=1
    # 按分组ID创建独立数组存储元素
    declare -n current_group="group_${group_id}"
    current_group+=("${asc[$key]}")
done

# 遍历调用fn
for group_id in "${!group_list[@]}"; do
    declare -n current_group="group_${group_id}"
    fn "${current_group[@]}"
done

内容的提问来源于stack exchange,提问作者Han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:18:04