我想使用类似于Lodash的get和set,但是使用Ruby而不是JavaScript。我尝试了很少的搜索,但我找不到类似的东西。
Lodash的文档可能会以更好的方式解释它,但它从字符串路径中获取和设置属性(' x [0] .y.z' for例)。如果在设置属性时不存在完整路径,则会自动创建该路径。
答案 0 :(得分:1)
Ruby 2.3引入了新的安全导航器运算符来获取嵌套/链接值:
x[0]&.y&.z #=> result or nil
否则,Rails会使用try(…)
修补所有对象,允许您:
x[0].try(:y).try(:z) #=> result or nil
设置有点困难,我建议您在尝试设置属性之前确保拥有最终对象,例如:
if obj = x[0]&.y&.z
z.name = "Dr Robot"
end
答案 1 :(得分:1)
我最终将Lodash _.set和_.get从JavaScript移植到了Ruby和made a Gem。
答案 2 :(得分:0)
有时我需要以编程方式将属性的值深入到对象中,但问题是有时属性实际上是一个方法,有时它需要参数!
所以我想出了这个解决方案,希望它有助于为你的问题设计一个: (需要Rails'#try)
def reduce_attributes_for( object, options )
options.reduce( {} ) do |hash, ( attribute, methods )|
hash[attribute] = methods.reduce( object ) { |a, e| a.try!(:send, *e) }
hash
end
end
# Usage example
o = Object.new
attribute_map = {
# same as o.object_id
id: [:object_id],
# same as o.object_id.to_s
id_as_string: [:object_id, :to_s],
# same as o.object_id.to_s.length
id_as_string_length: [:object_id, :to_s, :length],
# I know, this one is a contrived example, but its purpose is
# to illustrate how you would call methods with parameters
# same as o.object_id.to_s.scan(/\d/)[1].to_i
second_number_from_id: [:object_id, :to_s, [:scan, /\d/], [:[],1], :to_i]
}
reduce_attributes_for( o, attribute_map )
# {:id=>47295942175460,
# :id_as_string=>"47295942175460",
# :id_as_string_length=>14,
# :second_number_from_id=>7}
答案 3 :(得分:0)
您可以使用大多数Lodash实用程序随附的Rudash Gem,不仅可以使用_.get和_.set。