给定一个符号数组,你将如何迭代数组,并存储匹配对的数组索引?
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"]
,而不是实际的数组索引。
答案 0 :(得分:4)
使用Array#map
代替Array#each
:
buzz = bar.map{|i| foo.index(i.to_sym)}
#=> [1, 4]
答案 1 :(得分: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.size
和m=bar.size
,则在构造哈希后只需要m
哈希查找。相比之下,对于bar
的每个元素,平均会有n/2
个比较来查找与foo
的元素匹配的bar
元素的索引,共计m*n/2
次比较。