如何使用Ruby按嵌套数组的首元素进行分组?
Ruby实现嵌套数组按首元素分组的解决方案
嘿,这个需求在Ruby里用内置方法就能轻松搞定,下面是具体的实现步骤和代码:
先明确你的输入与目标
原始输入数组
original_array = [ ["1", "className", "Connection"], ["2", "className", "Connection"], ["1", "connectorId", "100"], ["2", "connectorId", "100"], ["1", "part_1", "side_1"], ["2", "part_1", "side_1"], ["1", "part_2", "bottomPanel_1"], ["2", "part_2", "bottomPanel_1"], ["1", "transformation", nil], ["2", "transformation", nil] ]
期望的分组输出
[ [["1", "className", "Connection"], ["1", "connectorId", "100"], ["1", "part_1", "side_1"], ["1", "part_2", "bottomPanel_1"], ["1", "transformation", nil]], [["2", "className", "Connection"], ["2", "connectorId", "100"], ["2", "part_1", "side_1"], ["2", "part_2", "bottomPanel_1"], ["2", "transformation", nil]] ]
核心实现代码
Ruby的Enumerable#group_by就是专门干分组活儿的,我们只需要指定分组依据为子数组的第一个元素,再提取分组后的集合即可:
# 第一步:按子数组首元素分组,得到一个哈希(key是首元素,value是对应子数组集合) grouped_data = original_array.group_by { |sub_array| sub_array.first } # 第二步:提取哈希里的所有value,转换成你要的二维数组格式 final_result = grouped_data.values # 打印结果验证 puts final_result.inspect
代码说明
group_by { |sub_array| sub_array.first }:遍历原始数组的每个子数组,把每个子数组的第一个元素作为分组的“标识”,最终返回一个哈希结构,比如{"1"=>[...所有首元素为1的子数组...], "2"=>[...所有首元素为2的子数组...]}。grouped_data.values:把哈希中的值部分提取出来,直接转换成二维数组,完全符合你的需求。
额外优化(可选)
如果想让每个分组内部的子数组按第二个元素排序(比如按属性名排序),可以再加一步映射操作:
sorted_result = grouped_data.values.map do |group| group.sort_by { |sub_array| sub_array[1] } end
这样每个分组内的子数组就会按第二个元素(比如className、connectorId这些)的字母顺序排列啦~
内容的提问来源于stack exchange,提问作者Marcin Jankowski
相关产品推荐
相关产品推荐

