For循环访问索引的数组元素

时间:2015-03-05 17:21:23

标签: ruby-on-rails ruby arrays

我试图比较当前索引的元素名称和每个元素的上一个索引,以确定它们是否是同一个名称,因此我不打印两次名称。

不幸的是,尝试使用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 %>

有没有人知道访问数组中元素的正确方法?

4 个答案:

答案 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