在匹配的键到结尾之后从哈希中删除元素

时间:2016-03-23 09:44:07

标签: ruby hash

我有一个哈希

graph_data = {"12 am"=>0, "1 am"=>0, "2 am"=>0, "3 am"=>0, "4 am"=>0, "5 am"=>0, "6 am"=>0, "7 am"=>0, "8 am"=>0, "9 am"=>0, "10 am"=>0, "11 am"=>0, "12 pm"=>0, "1 pm"=>0, "2 pm"=>0, "3 pm"=>0, "4 pm"=>0, "5 pm"=>0, "6 pm"=>0, "7 pm"=>0, "8 pm"=>0, "9 pm"=>0, "10 pm"=>0, "11 pm"=>0}

我想删除graph_data键后面显示的"3 pm"中的所有元素。我正在寻找的输出是:

group_data = {"12 am"=>0, "1 am"=>0, "2 am"=>0, "3 am"=>0, "4 am"=>0, "5 am"=>0, "6 am"=>0, "7 am"=>0, "8 am"=>0, "9 am"=>0, "10 am"=>0, "11 am"=>0, "12 pm"=>0, "1 pm"=>0, "2 pm"=>0, "3 pm"=>0"}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

graph_data.slice_after{|k, _| k == "3 pm"}.first.to_h
# => {"12 am"=>0, "1 am"=>0, "2 am"=>0, "3 am"=>0, "4 am"=>0, "5 am"=>0, "6 am"=>0, "7 am"=>0, "8 am"=>0, "9 am"=>0, "10 am"=>0, "11 am"=>0, "12 pm"=>0, "1 pm"=>0, "2 pm"=>0, "3 pm"=>0}

h = graph_data.dup
h.each_key.inject(false) do
  |flag, k|
  h.delete(k) if flag
  flag = true if k == "3 pm"
  flag
end
h # => {"12 am"=>0, "1 am"=>0, "2 am"=>0, "3 am"=>0, "4 am"=>0, "5 am"=>0, "6 am"=>0, "7 am"=>0, "8 am"=>0, "9 am"=>0, "10 am"=>0, "11 am"=>0, "12 pm"=>0, "1 pm"=>0, "2 pm"=>0, "3 pm"=>0}

答案 1 :(得分:1)

您也可以尝试这种方式

你的价值

graph_data = {"12 am"=>0, "1 am"=>0, "2 am"=>0, "3 am"=>0, "4 am"=>0, "5 am"=>0, "6 am"=>0, "7 am"=>0, "8 am"=>0, "9 am"=>0, "10 am"=>0, "11 am"=>0, "12 pm"=>0, "1 pm"=>0, "2 pm"=>0, "3 pm"=>0, "4 pm"=>0, "5 pm"=>0, "6 pm"=>0, "7 pm"=>0, "8 pm"=>0, "9 pm"=>0, "10 pm"=>0, "11 pm"=>0}

现在

ar = graph_data.to_a
ar.reject{|j| ar.index(j) > ar.find_index(["3 pm", 0])}.to_h
=> {"12 am"=>0, "1 am"=>0, "2 am"=>0, "3 am"=>0, "4 am"=>0, "5 am"=>0, "6 am"=>0, "7 am"=>0, "8 am"=>0, "9 am"=>0, "10 am"=>0, "11 am"=>0, "12 pm"=>0, "1 pm"=>0, "2 pm"=>0, "3 pm" => 0}