假设我有以下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
如果有更好的方法来获取元素,请帮助。
答案 0 :(得分:1)
sample = [["Tom",1],["Jerry",2]]
sample_hash = Hash[sample]
现在你可以(考虑到条件,即第一个元素是唯一的,如果值重复,那么第一个键将是匹配值的输出) -
对Ruby 1.9或更高版本使用Hash#key(value)
:
sample_hash.key(1) #=> "Tom"
对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"