什么相当于Lodash在Ruby中获取和设置?

时间:2016-02-09 14:33:54

标签: ruby lodash

我想使用类似于Lodash的get和set,但是使用Ruby而不是JavaScript。我尝试了很少的搜索,但我找不到类似的东西。

Lodash的文档可能会以更好的方式解释它,但它从字符串路径中获取和设置属性(' x [0] .y.z' for例)。如果在设置属性时不存在完整路径,则会自动创建该路径。

4 个答案:

答案 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。