2014-08-31 75 views
1

我有這樣的陣列:檢查部分值是內部陣列

>> arr = [["a",1,"b"],["a",2,"b"],["b",3,"d"],["t",6,"a"]] 

我要檢查,如果[「一」,1]存在於arr內部而忽略了arr項的第三值。

是否有更好的方法,然後在arr第一去除每個項目的第3個值:

>> new_arr = [["a",1],["a",2],["b",3],["t",6]] 

,然後做

>> new_arr.include? ["a",1] 
true 

喜歡的東西:

arr.include? ["a",1,/*/] #the 3rd value can be anything 

感謝。

回答

4

你可以試試下面的:

arr = [["a",1,"b"],["a",2,"b"],["b",3,"d"],["t",6,"a"]] 
arr.any? { |v1, v2, *| [v1, v2] == ["a", 1] } 
# => true 
arr.any? { |v1, v2, *| [v1, v2] == ["a", 4] } 
# => false 

包裝邏輯的方法中:

def check_subarray(ary, sub_ary) 
    ary.any? { |e1, e2, *| [e1, e2] == sub_ary } 
end 

arr = [["a",1,"b"],["a",2,"b"],["b",3,"d"],["t",6,"a"]] 
check_subarray(arr, ["a", 1]) # => true 
+0

謝謝!像一個魅力 – MichaelR 2014-08-31 06:45:22

+3

@MichaelR你的*複選標記*是我的生日禮物。 :-) – 2014-08-31 06:45:57

+0

希望你會多得幾個;) – MichaelR 2014-08-31 06:47:52

0

另一種方式:

def values_there?(arr, val) 
    arr.transpose[0,val.size].transpose.include? val 
end 

values_there?(arr, ["a", 2]) #=> true 
values_there?(arr, [3, "d"]) #=> false 
2

下面是一個更復雜的版本@奧雅納的答案(它可以處理任意長度)

def match_head(*head) 
    ->(full_array) { 
    head.each_with_index do |head_elem, idx| 
     return false if full_array[idx] != head_elem 
    end 

    true 
    } 
end 

ary = [["a",1,"b"],["a",2,"b"],["b",3,"d"],["t",6,"a"]] 
ary.any?(&match_head('a')) # => true 
ary.any?(&match_head('c')) # => false 
ary.any?(&match_head('a', 1)) # => true 
ary.any?(&match_head('a', 1, 'b')) # => true 
ary.any?(&match_head('a', 1, 'f')) # => false