我有一个哈希,如:
{
"ruby": 5,
"python": 4,
"java": 3,
"js": 2,
"php", 1
}
我知道如何迭代哈希:
<% languages.each for |key, value| %>
<% end %>
我想迭代这个Hash的前半部分,我可以使用languages.length
获得Hash的大小,但languages[i]
似乎什么都不返回。
答案 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 %>