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

Ruby中按哈希数组指定字段分组并输出姓名的实现疑问

你用group_by的思路是完全正确的,这正是Ruby处理分组需求的标准方式,问题出在后续处理分组结果的逻辑上,才导致了结构混乱和nil值的出现。

问题分析

grouped_data是一个哈希结构:键是分组字段的值(比如"tennis"),值是对应分组的人员哈希数组。你先把哈希的键push到new_array,之后用flatten.flatten强行拆平哈希结构,遍历的时候遇到非哈希元素(比如之前的分组键),访问n["name"]自然会得到nil,这就是那些无效值的来源,同时也彻底打乱了分组的层级结构。

修正后的实现方案

1. 直接输出目标格式(最简洁)

不需要额外构建数组,直接遍历分组后的哈希输出即可:

puts "Enter what category to search"
category = gets.chomp

# 增加输入验证,避免非法字段导致错误
unless ["hobby", "food"].include?(category)
  puts "请输入合法分类:'hobby' 或 'food'"
  exit
end

grouped_data = people.group_by { |person| person[category] }

grouped_data.each do |group_value, members|
  puts group_value
  members.each { |member| puts member["name"] }
end

2. 生成目标格式的数组

如果确实需要构建包含分组标题和姓名的数组,可以这样写:

puts "Enter what category to search"
category = gets.chomp

grouped_data = people.group_by { |person| person[category] }

result_array = []
grouped_data.each do |group_value, members|
  result_array << group_value
  # 把当前分组的姓名批量追加到数组
  result_array += members.map { |member| member["name"] }
end

p result_array
# 输入"hobby"时输出:["tennis", "John", "Joseph", "Mary", "board games", "Lauren", "Karen", "cycling", "Amir", "Will"]

3. 优化:按分组标题排序输出

如果需要分组按字母顺序排列,可以对哈希的键排序后遍历:

grouped_data.keys.sort.each do |group_value|
  puts group_value
  grouped_data[group_value].each { |member| puts member["name"] }
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:01:00