如何在数组中找到最佳匹配元素?

Mar*_*cos 13 ruby watir-webdriver

我需要一些看似简单但让我感到困惑的事情的帮助.尝试编写一些模糊匹配方法,以处理根据需要计算的值与实际可从选择列表中获得的值之间的格式差异.

值(选项执行价格)始终是计算的Float like 85.0或Int.

数组包含字符串形式的数字,在任何一个增量中都是不可预测的,或者它们是否会显示为舍入到某个小数(包括额外的零5.50)或没有小数(如85),例如:

select_list = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"]
Run Code Online (Sandbox Code Playgroud)

我不确定如何编写一行或两行代码,这些代码将返回数组中出现的最接近的匹配元素(按数字值).例如,如果select_list.contains? 85.0返回 "85"

实际上,选择选项来自Watir::Webdriver browser.select_list(:id, "lstStrike0_1")HTML对象,其可见文本(不是HTML值)是那些数字; 也许有更直接的方式来调用 browser.select_list(:id, "lstStrike0_1").select XWatir如何将所有这些选择转换为Ruby数组?

tok*_*and 22

xs = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"]
xs.min_by { |x| (x.to_f - 82.4).abs } 
#=> "82.5"
Run Code Online (Sandbox Code Playgroud)


Ott*_*ger 5

我不是一个红宝石编码器,所以这可能不是最好的方法

def select_closest(list, target)                               
    return (list.map {|x| [(x.to_f - target).abs, x]}).min[1]  
end                                                            

select_list = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"] 

puts select_closest(select_list, 81)  # yields 80
Run Code Online (Sandbox Code Playgroud)