Ruby:检查数组中所有对象的属性是不是相等

Posted

技术标签:

【中文标题】Ruby:检查数组中所有对象的属性是不是相等【英文标题】:Ruby: Check if all objects' attribute within array are equalRuby:检查数组中所有对象的属性是否相等 【发布时间】:2015-10-04 17:58:56 【问题描述】:

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

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

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? 也会短路 :) 【参考方案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? 准备数据。

以上是关于Ruby:检查数组中所有对象的属性是不是相等的主要内容,如果未能解决你的问题,请参考以下文章

检查数组中所有元素是不是相等的最快方法

检查数组的所有值是不是相等

C ++如何检查数组中的元素是不是相等?

如何检查数组中的数字是不是相等?

检查联合实例之间是不是相等的正确方法是啥?

c# 比较两个对象的值是不是相等