我试图比较当前索引的元素名称和每个元素的上一个索引,以确定它们是否是同一个名称,因此我不打印两次名称。
不幸的是,尝试使用array[i]
访问数组元素并不起作用,但如果我对索引进行硬编码或只是打印出索引,它就可以正常工作,所以我不确定它搞砸了。
我需要能够访问前一个元素,所以我不能使用其他循环,所以只建议我可以访问数组中的前一个元素。
<% for i in 1..count %>
<% if array[i].count > 1 %>
<% if array[i-1].name == array[i].name %>
<%= array[i].name %>
<%= array[7].name %>
<%= i %>
<% end %>
<% end %>
有没有人知道访问数组中元素的正确方法?
答案 0 :(得分:2)
如果您的列表已排序且您关心的是打印名称,则应该这样做:
<% array.map(&:name).uniq.each do |name| %>
<%= name %>
<% end %>
答案 1 :(得分:0)
更一般地说,你可以这样做:
array.each_with_index do |el, i|
prev_el = array[i-1] #will be nil for the first element
next_el = array[i+1] #will be nil for the last element
if prev_el && el.name == prev_el.name
#name same as previous
end
if next_el && el.name == next_el.name
#name same as next
end
end
你应该避免循环的基于索引的数组访问,不是因为它们不起作用,而是因为在Ruby中循环数组有更好,更可读的方法。
答案 2 :(得分:0)
你可以记住,你正在使用Ruby,而Ruby的座右铭是&#34; 在更少的工作中做更多事情&#34;。
您可以使用uniq
过滤掉所有类似的元素,然后遍历它们以执行您想要执行的任何操作。 uniq
的作用如下:
a = [ "a", "a", "b", "b", "c" ]
a.uniq # => ["a", "b", "c"]
这应该是您尝试做的所有事情:
<% array.uniq.each do |obj| %>
<%= obj.name %>
<% end %>
答案 3 :(得分:0)
想到另一种方法:
grouped = array.group_by(&:name)
现在你有一个哈希,其中每个键都是唯一的名称,相应的值是具有该名称的所有数组元素。接下来你可以做像
这样的事情#list of names in alphabetical order
grouped.keys.sort
#get one element for each unique name
grouped.map{|name,els| els.first}
#print out how many you have for each name
grouped.each{|name, els| puts "#{name.inspect} => #{els.size} elements"};false