是否存在API或如何创建可通过点(。)方法访问的哈希键,如果存在对象数组。
以下是一个例子:
HTML
如果我尝试这样做:
data = [
{
key1: 'value1',
key2: 'value2'
},
{
key1: 'valuex',
key2: 'valuey'
},
...
]
会收到此错误:
data.collect(&:key1)
然而这有效:
NoMethodError: undefined method `key1' for #<Hash:0x007fc2a7159188>
仅仅因为它是一个符号而不是对象属性。有没有一种方法可以用符号完成相同的行为,就好像它们是对象属性一样?
答案 0 :(得分:0)
您可以使用OpenStruct
包装对象require 'ostruct'
data.map { |it| OpenStruct.new(it) }.collect(&:key1)
答案 1 :(得分:0)
您可以将这些哈希值包装到OpenStruct
中。尝试使用此代码:
data.map! { |hsh| OpenStruct.new(hsh) }
data.first.key1 # => "value1"
答案 2 :(得分:0)
这是受@ spickerman评论的启发。这是人们可以做的事情,但可能不应该这样做。
您可以将自定义方法添加到Ruby的Enumerable模块中:
module Enumerable
def enum_send(:method, *args)
send(:method) { |obj| obj.send(*args) }
end
end
然后你可以打电话
data.enum_send(:collect, :"[]", :key1) ## [value1, valuex..]
或类似
data.enum_send(:each, :delete, :key2) ## [{key1: value1}, {key1: valuex}..]