【问题标题】:Ruby: Check if all objects' attribute within array are equalRuby:检查数组中所有对象的属性是否相等
【发布时间】:2023-04-06 08:50:01
【问题描述】:

我有一个包含对象的数组。我想检查数组中的所有元素(对象)是否具有相似的属性值。

所以,如果我们有以下数组

array = [clone1, clone2, clone3]

clone1、clone2 和 clone3 是类 clone 的对象。它们包含一个名为“源”的属性。我想检查 clone1、clone2 和 clone3 是否具有相同的“源”值。

这是一个克隆对象的例子

#<CloneTool:0x007ff968a2f7b0 @nline=["10"], @sim=["100"], @ds=[".."], @dstart=[".."], @dend=[".."], @hs=[".."], @hstart=[".."], @hend=[".."]>

所以我想检查 @ds 的数组是否具有相同的值。

有什么想法吗?

【问题讨论】:

  • ary.all? {|elem| elem.source == ary.first.source}
  • ary.any? {|elem| elem.source != ary.first.source} # find one that NOT equal
  • @gaussblurinc:通常情况下,您希望明确说明您的意图。看来,他打算检查所有元素是否具有相同的值。检查是否有任何元素具有不同的值在某种程度上掩盖了意图。
  • @SergioTulentsev 就短路而言,它没有区别。 all? 在块计算为 false 时短路,any? 在块计算为 true 时短路。并且由于后者的块是前者的否定,因此它们将在完全相同的示例上短路。
  • @gaussblurinc:sawa 提醒我们 all? 也会短路 :)

标签: arrays ruby


【解决方案1】:
array.map(&:source).uniq.length == 1

array.group_by(&:source).length == 1

【讨论】:

  • 它给出了“错误的参数类型 String (expected Proc) (TypeError)”
  • @arwa:你一定是搞砸了复制这条线。如果你的元素有方法source,它应该可以工作
  • 这对我有用,我猜他的克隆对象与我们想象的不同,这导致了他的失败。而不是 map(&:source) 它可能需要是 map{|x| x[:source]} 或类似的东西。
【解决方案2】:
arr.uniq(&:source).size == 1

如果@source没有访问器:

arr.uniq { |e| e.instance_variable_get(:@source) }.size == 1

【讨论】:

    【解决方案3】:
    array.map{|x| x.source == array[0].source}.all?
    

    【讨论】:

    • 它不适用于特殊数组。例如,一个元素的数组
    • @gaussblurinc 它确实有效。在这种情况下,结果将是微不足道的true。注意[].all? # =&gt; true.
    • all? 的用法很奇怪。 “全部”是什么?
    • @sawa: 但map 负责在这里为all? 准备数据。
    猜你喜欢
    • 2020-12-27
    • 2015-02-12
    • 2019-07-04
    • 2023-03-26
    • 2013-01-27
    • 2017-11-26
    • 1970-01-01
    • 2013-07-03
    • 2010-11-12
    相关资源
    最近更新 更多