我有一个具有顶部和左侧属性的对象数组,如下所示:
[{top: 30, left: 20}, {top:50, left:10}, {..}]
我试图找到有多少个对象具有近似相同的顶值。在这种情况下:
[{top: 10, left: 20}, {top:10, left:10}, {top: 10, left: 123},
{top:500, left:10}, {top:2, left: 50}, {top:2, left:400}]
该方法将返回5
,因为有三个对象以10
作为最高值,两个对象以2
作为最高值。如果有一个对象没有与其他任何东西共享其最高值,则不会将其考虑在内。我不是在寻找确切的值,而是在值上有10%的灵活性,以便{top:10, left:20}
和{top:10.13, left:20}
被认为具有相同的顶部。到目前为止,我有这个:
myarr.group_by { |x| x[:top] }.map { |k,v| [k, v.length] }.to_h
但这不会考虑此保证金错误。我不确定如何更改它以便这样做。
答案 0 :(得分:0)
根据您想要表达“相似”的方式,您可以执行以下操作:
def count_similar(a, lower_bound, upper_bound)
a.count { |h| h[:top] >= lower_bound && h[:top] <= upper_bound }
end
a = [{top: 10, left: 20}, {top:10, left:10}, {top: 10, left: 123},
{top:500, left:10} , {top:2, left: 50}, {top:2, left:400}]
count_similar(a, 1, 19) #=> 5