-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdig.rb
51 lines (41 loc) · 1.15 KB
/
dig.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Array
result = [[[1,2,3]]]
result.dig(0,0,0) #=> 1
result.dig(0,1,2) #=> nil
# Hash
user = {
user: {
address: {
street: '123 Main Street'
}
}
}
user.dig(:user, :address, :street) #=> '123 Main Street'
user.dig(:user, :address, :street1) #=> nil
# OpenStruct
address = OpenStruct.new('city' => "Anytown NC", 'zip' => 12345)
person = OpenStruct.new('name' => 'John Smith', 'address' => address)
person.dig(:address, 'zip') #=> 12345
person.dig(:bussiness_address, 'zip') # nil
# ruby patch
class Array
def dig(index, *indices)
Array[index, indices].flatten.inject(self) { |result, index| result.send(:[],index) rescue nil }
end unless Hash.method_defined?(:dig)
end
# array.send(:[], index) == array[index]
class OpenStruct
def dig(name, *names)
begin
name = name.to_sym
rescue NoMethodError
raise TypeError, "#{name} is not a symbol nor a string"
end
@table.dig(name, *names)
end unless OpenStruct.method_defined?(:dig)
end
moudle Enumerable
def dig(arg, *args)
Array[arg, args].flatten.inject(self) { |result, arg| result.send(:[], arg) rescue nil }
end unless Enumerable.method_defined?(:dig)
end