如何在rails中迭代Hash的前半部分?

时间:2015-02-06 15:52:01

标签: ruby-on-rails ruby hash

我有一个哈希,如:

{
    "ruby": 5,
    "python": 4, 
    "java": 3,
    "js": 2,
    "php", 1
}

我知道如何迭代哈希:

<% languages.each for |key, value| %>

<% end %>

我想迭代这个Hash的前半部分,我可以使用languages.length获得Hash的大小,但languages[i]似乎什么都不返回。

4 个答案:

答案 0 :(得分:3)

  

事实上,我想首先获得{"ruby": 5, "python": 4, "java": 3},然后我想获得{"js": 2, "php": 1}

Rails提供in_groups_of方法,但您必须将languages转换为数组:

languages = { ruby: 5, python: 4, java: 3, js: 2, php: 1 }.to_a

languages.in_groups_of(3, false).each do |group|
  group.each do |key, value|
    puts "#{key} = #{value}"
  end
  puts '---'
end

输出:

ruby = 5
python = 4
java = 3
---
js = 2
php = 1
---

答案 1 :(得分:1)

您可以获得一组密钥:

keys = myhash.keys[0, myhash.length / 2]

然后您可以选择这些键的哈希条目:

firsthalf = myhash.select {|key,value| keys.include?(key) }

这为您提供了可以迭代的哈希的前半部分的副本,推送到视图以在那里进行迭代等等。但是,如果这是一个非常大的哈希,您不想复制,那么它是最好的如上所述进行迭代,并在完成后停止。

答案 2 :(得分:1)

这是一个快速的方法:

languages.first(languages.length / 2).each do |k, v|
   # Do what ever you want here
end

这是因为哈希元素的顺序是它们的键已被插入。

并回复您的评论

  

@Stefan,事实上,我想得到{&#34; ruby​​&#34;:5,&#34; python&#34;:4,&#34; java&#34;:3}   首先,然后我想得到{&#34; js&#34;:2,&#34; php&#34;:1}

您可以使用each_slice

 slice_size = 3
 languages.each_slice(slice_size) do |slice|
     slice.each do |key, value|
        # do what you want with each element in the slice
     end
 end

答案 3 :(得分:0)

您可以使用each_with_index,它将遍历集合和提供者当前元素索引

<% languages.each_with_index for |value, index| %>

<% end %>