それっぽく動くコードを書いてみました
ruby
1def create_group_of_id(data)
2 ret = {}
3
4 data.keys.each do |key|
5 ids = data[key].map { |hash| hash[:id].to_i }
6 end_index = 0
7 key_count = 0
8
9 while ids[end_index] do
10 group = group_continuity_numbers(ids[end_index..-1])
11 end_index = ids.index(group.last)
12 break if end_index.nil?
13
14 if key_count.zero?
15 ret.update(key => group.map { |id| {id: id.to_s} })
16 else
17 ret.update("#{key}_#{key_count}".to_sym => group.map { |id| {id: id.to_s} })
18 end
19
20 key_count += 1
21 end_index += 1
22 end
23 end
24
25 ret
26end
27
28def group_continuity_numbers(ids, ret = [])
29 return ret if ids.size.zero?
30
31 a, b, *ids = ids
32
33 return ret if a.nil? || b.nil?
34 return ret if (a - b).abs >= 2
35
36 group_continuity_numbers([b, ids].flatten, [ret, a, b].flatten.uniq)
37end
38
39data =
40 {
41 :a => [
42 {:id => "1"},
43 {:id => "2"},
44 {:id => "5"}, # <= id が 2から5へと+3増えている。
45 {:id => "6"},
46 {:id => "9"}, # <= id が 6から9へと+3増えている。
47 {:id => "10"}
48 ],
49 :b => [
50 {:id => "1"},
51 {:id => "2"},
52 ]
53 }
54
55pp result = create_group_of_id(data)
56# =>
57# {
58# :a=>[
59# {:id=>"1"},
60# {:id=>"2"}
61# ],
62# :a_1=>[
63# {:id=>"5"},
64# {:id=>"6"}
65# ],
66# :a_2=>[
67# {:id=>"9"},
68# {:id=>"10"}
69# ],
70# :b=>[
71# {:id=>"1"},
72# {:id=>"2"}
73# ]
74# }
他のデータを与えたり詳細なテストはしていないので、もしかしたら動かないパターンもあるかもしれません
なにか参考になれば幸いです
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/22 01:58