旋转阵列,直到满足条件



我知道如何做到这一点,但这似乎不像是Ruby的方式。

我一周中有几天的哈希:

DAYS = {
1 => "Monday",
2 => "Tuesday",
3 => "Wednesday",
4 => "Thursday",
5 => "Friday",
6 => "Saturday",
7 => "Sunday"}

(可能有一些 rails 助手,但我已经以我能想到的最快方式实现了它)

现在我想创建一个数组,其中第一个元素是今天,其他日子应该保持有序。

这是这个数组

 def day_keys
    # proper sorting of days, start with today and then continue
    day_array = (1..7).to_a
    loop do
      break if day_array.first == Time.now.wday
      day_array.rotate!
    end
    day_array
  end

今天是星期五,所以它返回[5,6,7,1,2,3,4].在此之后,我将这个数组中的值与DAYS哈希中的键映射以查找日期名称。

解决方案对我来说似乎很粗糙,所以我想听听一些关于如何实现它的想法。我花了一些时间查看Array#cycleEnumerable#inject但似乎没有什么适合我的需求。

怎么样:((Time.now.wday)..(Time.now.wday+6)).collect{|i| ((i-1) % 7) +1}

如果你在轨道上,你还有几个帮手。这将生成一个日期数组:

 ((Time.now.to_date)..(6.days.from_now.to_date)).collect{|i| i}

如果你想要日期名称,它只是一个轻微的修改

 ((Time.now.to_date)..(6.days.from_now.to_date)).collect{|i| i.strftime "%A"}

这样的事情会起作用...

DAYS_HASH = { 'Mon' => 1,
'Tue', => 2,
'Wed', => 3,
'Thu', => 4,
'Fri', => 5 }
DAYS_ARY = ['Mon','Tue','Wed','Thu','Fri']
def days(start)
  DAYS_ARRAY.rotate(start-1)
end

天(DAYS_HASH["星期三"])

=> ['Wed', 'Thu', 'Fri', 'Mon', 'Tue']

如果你有 ruby 1.8.7

day_array.index(Time.now.wday).times do day_array.push(day_array.shift) end

如果你有 Ruby 1.9.2

day_array.index(Time.now.wday).times do day_array.rotate end
require 'date'
today = Date.today
p (today..today+6).map{|day| Date::DAYNAMES[day.wday]}
#=>["Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"]

最新更新