Ruby 1.9 - 从2D数组中选择元素

时间:2015-02-11 06:26:16

标签: ruby-on-rails ruby arrays

假设我有以下2D数组

sample  = [["Tom",1],["Jerry",2]]

我想从数组中获取“Jerry”。 目前我正在使用

sample.select{|i| i if i[1] == 2}[0][0]

我也试过

sample.select{|i| i if i[1] == 2}.first.first # Returns "Jerry" - OK
sample.select{|i| i[0] if i[1] == 2}          # Returns ["Jerry",2] - NOT OK

如果有更好的方法来获取元素,请帮助。

6 个答案:

答案 0 :(得分:1)

sample  = [["Tom",1],["Jerry",2]]
sample_hash = Hash[sample]

现在你可以(考虑到条件,即第一个元素是唯一的,如果值重复,那么第一个键将是匹配值的输出) -

  1. 对Ruby 1.9或更高版本使用Hash#key(value)

    sample_hash.key(1) #=> "Tom"

  2. 对Ruby 1.8使用Hash#index(value)

    sample_hash.index(1) #=> "Tom"

答案 1 :(得分:0)

如果你想获得所有名字,可以试试这个:

sample.collect(&:first)
# => ["Tom", "Jerry"]

但是,在您的问题中,您只想要第一个元素的名称,您可以试试这个:

sample.first.first
# => "Tom"

如果您的搜索取决于名称" Tom",则:

sample.detect{|i| i.first == "Tom"}.first
# => "Tom"

根据第二个元素的值返回名称:

sample.detect{|i| i[1] == 1}.first
# => "Tom"

答案 2 :(得分:0)

在展平输入sample上使用Enumerable#find

> sample  = [["Tom",1],["Jerry",2]]
> sample.flatten.find { |name| name == 'Tom' }
=> "Tom"

根据OP的评论更新:

> sample.find { |name, id| id == 1 }.first
=> "Tom"

答案 3 :(得分:0)

这也适用于你

sample.flatten.first 

sample.flatten[0]

答案 4 :(得分:0)

最好的方法是使用哈希,但是如果你想把它作为一个列表,那么看看函数rassoc

sample  = [["Tom",1],["Jerry",2]]

p sample.rassoc(2) #=> ["Jerry",2]
p sample.rassoc(2).first #=> "Jerry"

jerry_item,_ = sample.rassoc(2)
p jerry_item => "Jerry"

答案 5 :(得分:0)

  

如果有更好的方法来获取元素,请帮助。

sample.select { |i| i if i[1] == 2 }
#=> [["Jerry", 2]]

可以写成:

sample.select { |i| i[1] == 2 }
#=> [["Jerry", 2]]

请注意select返回一个数组。要查找第一个元素,请使用find

sample.find { |i| i[1] == 2 }
#=> ["Jerry", 2]

您仍然需要致电[0].first才能获得"Jerry"。将Hash(或自定义类)用于结构化数据可能更简洁:

sample = [{name: 'Tom', id: 1}, {name: 'Jerry', id: 2}]
sample.find { |h| h[:id] == 2 }[:name]
#=> "Jerry"

使用另一个哈希来按id属性存储这些对象是另一种选择:

sample_by_id = sample.map { |h| [h[:id], h] }.to_h
#=> {1=>{:name=>"Tom", :id=>1}, 2=>{:name=>"Jerry", :id=>2}}
sample_by_id[1][:name]
#=> "Jerry"