关联数组分组遍历问题:按键首数字分组传递给函数fn的实现方案
以下是Bash环境下的实现方案,兼容Bash 4.0及以上版本:
实现逻辑
- 先提取所有键名横杠前的前缀,去重得到所有分组编号
- 遍历每个分组编号,筛选出对应前缀的所有数组元素,传入目标函数
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
相关产品推荐
相关产品推荐

