开发者

Ruby way to loop and check subsequent values against each other

开发者 https://www.devze.com 2023-01-30 06:28 出处:网络
I have an array that contains dates and values. An example of how it might look: [ {\'1/1/2010\' => \'aa\'},

I have an array that contains dates and values. An example of how it might look:

[
  {'1/1/2010' => 'aa'}, 
  {'1/1/2010' => 'bb'}, 
  {'1/2/2010' => 'cc'}, 
  {'1/2/2010' =&g开发者_StackOverflow社区t; 'dd'}, 
  {'1/3/2010' => 'ee'}
]

Notice that some of the dates repeat. I'm trying to output this in a table format and I only want to show unique dates. So I loop through it with the following code to get my desired output.

prev_date = nil
@reading_schedule.reading_plans.each do |plan|
  use_date = nil
  if plan.assigned_date != prev_date
    use_date = plan.assigned_date
  end
  prev_date = plan.assigned_date
  plan.assigned_date = use_date
end

The resulting table will then look something like this

1/1/2010 aa
         bb
1/2/2010 cc
         dd
1/3/2010 ee

This work fine but I am new to ruby and was wondering if there was a better way to do this.


Enumerable.group_by is a good starting point:

require 'pp'

asdf = [
  {'1/1/2010' => 'aa'}, 
  {'1/1/2010' => 'bb'}, 
  {'1/2/2010' => 'cc'}, 
  {'1/2/2010' => 'dd'}, 
  {'1/3/2010' => 'ee'}
]

pp asdf.group_by { |n| n.keys.first }.map{ |a,b| { a => b.map { |c| c.to_a.last.last } } }
# >> [{"1/1/2010"=>["aa", "bb"]}, {"1/2/2010"=>["cc", "dd"]}, {"1/3/2010"=>["ee"]}]

Which should be a data structure you can bend to your will.


I don't know as though it's better, but you could group the values by date using (e.g.) Enumerable#reduce (requires Ruby >= 1.8.7; before that, you have Enumerable#inject).

arr.reduce({}) { |memo, obj|
  obj.each_pair { |key, value|
    memo[key] = [] if ! memo.has_key?(key);
    memo[key] << value
  }
  memo
}.sort

=> [["1/1/2010", ["aa", "bb"]], ["1/2/2010", ["cc", "dd"]], ["1/3/2010", ["ee"]]]

You could also use Array#each to similar effect.


This is totally a job for a hash.

Create a hash and use the date as the hashkey and an empty array as the hashvalue.

Then accumulate the values from the original array in the hashvalue array

0

精彩评论

暂无评论...
验证码 换一张
取 消