我使用 Ruby on Rails 5.0.1 和 Ruby 2.4。我有一个对象数组,存储在数组“结果”中。每个对象都有一个数字属性
numeric_attr
我想知道,给定我的数组,我如何判断我是否正好有一个数字属性值为“1”且递增 1 的对象。顺序并不重要。因此,例如,如果我有一个包含三个对象的数组,
[MyObject(numeric_attr = 2), MyObject(numeric_attr = 1), MyObject(numeric_attr = 3)]
我想知道我是否正好有一个 numeric_attr = 1 的对象,另一个 numeric_attr = 2 的对象,另一个 numeric_attr = 3 的对象。所以以上满足条件。下面的例子没有
[MyObject(numeric_attr = 4), MyObject(numeric_attr = 1), MyObject(numeric_attr = 3)]
因为虽然有一个 numeric_attr = 1 的对象,但没有 numeric_attr = 2 的对象。可能 numeric_attr 字段为零。我怎么能弄明白呢?
这个单行应该工作:
results.map(&:numeric_attr).sort == (1..results.count).to_a
解释:
results
#=> [#<MyObject:... @attr=2>, #<MyObject:... @attr=3>, #<MyObject:... @attr=1>]
results.map(&:attr)
#=> [2, 3, 1]
results.map(&:attr).sort
#=> [1, 2, 3]
(1..results.length).to_a
#=> [1, 2, 3]
# therefore:
results.map(&:attr).sort == (1..results.count).to_a
#=> true
如果有一个机会,numeric_attr
就是nil
:
results.map(&:attr).compact.sort == (1..results.count).to_a
当然,即使只有一个nil
值,结果也一定是false
。
如果序列可以从任何数字开始,而不仅仅是 1:
results.map(&:attr).sort == results.count.times.to_a.
map { |i| i + results.map(&:attr).sort.first }
但这不是很有效,因为它对数字进行了两次排序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句