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

如何将Ruby数组按子元素首字段分组生成对应结构的哈希

Ruby实现数组按首元素分组转哈希的方法

首先定义你给出的原始数组:

original_arr = [
  ["vietnam", "Hồ Chí Minh", "ho-chi-minh", 131],
  ["vietnam", "Hà Nội", "ha-noi", 96],
  ["lao", "Vien", "vien", 26],
  ["thailand", "Bangkok", "bangkok", 11],
  ["vietnam", "Đồng Nai", "dong-nai", 10],
  ["china", "Shanghai", "shanghia", 8],
  ["lao", "ABC", "abcc", 24],
  ["vietnam", "Long An", "long-an", 6]
]

最简实现(Ruby 2.4及以上版本支持)

直接用内置的group_by和transform_values方法一行完成:

result = original_arr.group_by { |sub_arr| sub_arr[0].to_sym }
                     .transform_values { |groups| groups.map { |item| item[1..] } }

逻辑说明:

  1. group_by方法以子数组的第一个元素转成符号作为哈希键,将所有匹配的完整子数组归为同一分组
  2. transform_values处理每个分组的内容,只保留子数组从索引1开始的剩余元素

兼容低版本Ruby的实现

如果使用2.4以下不支持transform_values的Ruby版本,可以用手动遍历的方式实现:

# 初始化哈希,默认新键对应空数组,避免引用异常
result = Hash.new { |hash, key| hash[key] = [] }
original_arr.each do |sub_arr|
  key = sub_arr[0].to_sym
  # 跳过首元素,把剩余内容塞进对应分组
  result[key] << sub_arr[1..-1]
end

注:你给出的预期输出示例中遗漏了Đồng Nai对应的分组项,上述代码会完整保留所有原始数组的内容。如果需要过滤掉第四个元素小于等于10的项匹配你给出的示例,可以在遍历过程中加判断条件:next if sub_arr[3] <= 10即可。


内容的提问来源于stack exchange,提问作者Hà Mai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:15:02