在 Rails 中,如何确定对象数组是否包含与给定值匹配的特定属性?

戴夫

我使用 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 字段为零。我怎么能弄明白呢?

伴侣Solymosi

这个单行应该工作:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ActiveRecord Rails 4,如何查看数组属性是否包含数组中的任何值

选择在数组属性中包含值的Rails对象

如何确定Javascript数组是否包含属性等于给定值的对象?

如何确定数组在Java中是否包含特定值?

从Rails中的对象数组保存属性

如何验证在Rails中包含数组内容

Rails 4活动记录,通过检查序列化的数组属性是否包含在另一个数组中来查找对象

如何在Rails中获得与给定年份匹配的行数?

如何隐藏数组对象以在Rails中哈希

Rails:使用特定模型属性的值构建数组

如何根据 Rails 和 Mongodb 中的字段值将对象数组拆分为子数组

删除嵌套在Ruby on Rails对象数组中的属性

如何确定数据库中的记录在Rails的特定列中是否有数据?

从Rails 2.3中的activerecord查询对象中提取属性值

检查数组是否包含具有特定属性值的对象

在rails中包含评论

如何放置角度模板以检查特定数组是否包含对象的属性等于某个值?

如何使用 .some() 查找对象数组是否包含特定属性值

如何在db中查询表中所有值与Rails数组中的值之一相匹配的项?

在Rails中动态包含对象的关联

如何确定Rails中的分组记录数?

如何将属性映射到 Rails 中的对象列表?

如何检查数组中的每个单词是否包含子字符串并拒绝Ruby on Rails中的子字符串?

Rails中的表单对象

更新 rails 中的数组

如何在 Ruby on Rails 中显示此数组中的值

如何在Ruby on Rails中的params数组中更改值?

Ruby on Rails:如何验证添加到数组中的对象?

Rails-如何显示父对象的属性