Rails搜索数组数组

时间:2012-09-24 20:04:15

标签: ruby-on-rails arrays include conditional

我有一个像这样的数组:[[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]。我想检查较大的数组是否包含给定数字的数组,而不考虑数组的动物元素。我也不希望循环通过数组,因为这会变得很重。

@boolean = bigArray.include?([2, *])这样的东西,除了实际有效的东西......

3 个答案:

答案 0 :(得分:3)

您有两种可能的解决方案。检测数组中的元素或将数组转换为Hash

1。使用Enumerable#detect,一旦找到匹配就会停止并返回,否则为nil

> a = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
 => [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]] 
> a.detect{ |(n, _)| n == 2 }
 => [2, "cat"]
> a.detect{ |(n, _)| n == 10 }
 => nil 

如果你想像你的例子那样将它添加到Array类,并强制它返回一个布尔值,请执行以下操作:

class Array
  def custom_include?(num)
    !!detect{ |(n, _)| num == n }
  end
end

示例:

> a.custom_include?(2)
 => true 
> a.custom_include?(10)
 => false

2. 如果您不关心碰撞键,可以将数组转换为Hash并查看密钥是否存在。

> a = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
 => [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]] 
> Hash[a][2]
 => "bird"
> Hash[a][10]
 => nil

答案 1 :(得分:0)

一种不涉及循环的非常简单的方法是将结构转换为散列。您的阵列恰好是理想的格式:

values = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]

Hash[values][2] # "bird"

您将丢失每个密钥的第一个值,但它将用于显示密钥是否存在。

答案 2 :(得分:0)

我们可以使用它:

arr = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
arr.assoc(2)

它将返回[2,cat]

如果元素不存在,则在数组中

arr.assoc(10)

返回零