有多少个对象具有相同的属性值?

时间:2014-03-24 23:48:15

标签: ruby enumerable

我有一个具有顶部和左侧属性的对象数组,如下所示:

[{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

但这不会考虑此保证金错误。我不确定如何更改它以便这样做。

1 个答案:

答案 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