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
相关产品推荐
相关产品推荐

