如何将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..] } }
逻辑说明:
group_by方法以子数组的第一个元素转成符号作为哈希键,将所有匹配的完整子数组归为同一分组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
相关产品推荐
相关产品推荐

