2014-11-04 44 views
1

給定一個符號數組,如何迭代數組,並存儲匹配對的數組索引?搜索數組符號 - Ruby

foo = [:date, :recorded_at, :scheduled_for, :amount, :activity, :pending ] 

例如,如果你搜索「recorded_at」和「活動」,它應該返回[1,4]

我覺得像這樣的工作:

bar = ['recorded_at','activity'] 
buzz = bar.each{|i| foo.index(i.to_sym)} 

然而,這只是返回字符串,["foo", "bar"],而不是實際的數組索引。

回答

4

使用Array#map,而不是Array#each

buzz = bar.map{|i| foo.index(i.to_sym)} 
#=> [1, 4] 
+0

這裏的常客,發現牛人一枚,哈哈! – scottxu 2014-11-04 03:36:17

+0

ni zen me ke yi yong zhong wen ne – dddd1919 2014-11-04 03:42:50

+0

好的,我下載yong pinyin! – scottxu 2014-11-04 03:44:54

0

的有效方法,特別是如果你有這個多次做,爲bar不同的值,或者如果數組很大,將先轉換foo到哈希:

foo = [:date, :recorded_at, :scheduled_for, :amount, :activity, :pending ] 

foo_hash = Hash[foo.map(&:to_s).zip([*0...foo.size]).to_h] 
    #=> {"date"=>0, "recorded_at"=>1, "scheduled_for"=>2, 
    # "amount"=>3, "activity"=>4, "pending"=>5} 

然後,它是用於bar任何值的簡單散列查詢:

bar = ['recorded_at','activity'] 
foo_hash.values_at(*bar) 
    #=> [1, 4] 

對於Ruby 1.9+ Hash[arr]可以替換爲arr.to_h

如果n=foo.sizem=bar.size,在構造散列之後將只需要m散列查找。通過對比,對於bar的每個元素,將平均比較來找出與bar的元素匹配的foo的元素的索引,總共爲m*n/2比較。