简体   繁体   中英

Ruby - Sorting of nested array of arrays with integers as strings

I am attempting to perform a sort of the array of arrays below. I am successfully able to perform the actual sort operation using sort_by but I cannot update the original array.

Instead, I am resorting to pushing each modified hash to a new array ( array ) and then trying to re-integrate/merge it with the original one which I don't think is the right approach for something as simple as sorting string integers... How do I simply sort the below data format? Creating a new object is perfectly acceptable ; this does not require an in-place sort operation but either approach is acceptable.

Expected Outcome

My goal is to simply sort ascending the chapter numbers (strings) which are the keys in my hashes. So, for example, Matthew is already in order however Acts should list 6 first, followed by 9 . Romans should list 2 first, followed by 15 , etc. Most importantly, the order of books (Matthew, Acts, Romans, and Revelation) must remain in tact.

Here's what I've tried:

array = Array.new

data.each do |x|
  array << Hash[x.last.sort_by {|k,v| k.to_i }]
end

# 'array' now contains accurate data that has been sorted but it more difficult to re-merge it than to simply sort the original data

Here's my data:

data = [["Matthew",
  {"4"=>[{:book=>"Matthew", :verse=>"18-20", :section=>"new_testament"}],
   "22"=>[{:book=>"Matthew", :verse=>"37-38", :section=>"new_testament"}]}],
 ["Acts",
  {"9"=>[{:book=>"Acts", :verse=>"8", :section=>"new_testament"}],
   "6"=>[{:book=>"Acts", :verse=>"27-28", :section=>"new_testament"}]}],
 ["Romans",
  {"15"=>[{:book=>"Romans", :verse=>"13A", :section=>"new_testament"}],
   "2"=>[{:book=>"Romans", :verse=>"4", :section=>"new_testament"}]}],
 ["Revelation",
  {"7"=>[{:book=>"Revelation", :verse=>"9-10", :section=>"new_testament"}],
   "2"=>[{:book=>"Revelation", :verse=>"2-5B", :section=>"new_testament"}],
   "1"=>[{:book=>"Revelation", :verse=>"9-10", :section=>"new_testament"}]}]]

I think you were just about there... just include the book name in your output.

new_data = []

data.each do |x|
  new_data << [ x[0], Hash[x[1].sort_by{|k,_| k.to_i }] ]
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM