Tag: hash

在Ruby中将嵌套的哈希键从CamelCase转换为snake_case

我正在尝试构建一个API包装器gem,并且在从API返回的JSON中将哈希键转换为更多Rubyish格式时遇到问题。 JSON包含多层嵌套,包括哈希和数组。 我想要做的是递归地将所有键转换为snake_case以便于使用。 这是我到目前为止所得到的: def convert_hash_keys(value) return value if (not value.is_a?(Array) and not value.is_a?(Hash)) result = value.inject({}) do |new, (key, value)| new[to_snake_case(key.to_s).to_sym] = convert_hash_keys(value) new end result end 上面调用此方法将字符串转换为snake_case: def to_snake_case(string) string.gsub(/::/, ‘/’). gsub(/([AZ]+)([AZ][az])/,’\1_\2′). gsub(/([az\d])([AZ])/,’\1_\2′). tr(“-“, “_”). downcase end 理想情况下,结果类似于以下内容: hash = {:HashKey => {:NestedHashKey => [{:Key => “value”}]}} convert_hash_keys(hash) # => {:hash_key => {:nested_hash_key […]

Ruby数组的哈希。 group_by并在一行中修改

我有一系列哈希,类似于 [ {:type=>”Meat”, :name=>”one”}, {:type=>”Meat”, :name=>”two”}, {:type=>”Fruit”, :name=>”four”} ] 我想把它转换成这个 { “Meat” => [“one”, “two”], “Fruit” => [“Four”]} 我试过group_by然后我得到了这个 { “Meat” => [{:type=>”Meat”, :name=>”one”}, {:type=>”Meat”, :name=>”two”}], “Fruit” => [{:type=>”Fruit”, :name=>”four”}] } 然后我不能修改它只留下名称而不是完整的哈希。 我需要在一行中执行此操作,因为对于Rails表单上的grouped_options_for_select 。

切片参数哈希特定值

摘要 给定Hash,基于要使用的键列表创建子集Hash的最有效方法是什么? h1 = { a:1, b:2, c:3 } # Given a hash… p foo( h1, :a, :c, :d ) # …create a method that… #=> { :a=>1, :c=>3, :d=>nil } # …returns specified keys… #=> { :a=>1, :c=>3 } # …or perhaps only keys that exist 细节 Sequel数据库工具包允许通过传入Hash来创建或更新模型实例: foo = Product.create( hash_of_column_values ) foo.update( […]

在比较密钥时,Ruby的Hash使用哪种相等性测试?

我有一个围绕一些对象的包装类,我想用它作为哈希中的键。 包装和解包对象应映射到同一个键。 一个简单的例子是: class A attr_reader 😡 def initialize(inner) @inner=inner end def x; @inner.x; end def ==(other) @inner.x==other.x end end a = A.new(o) #o is just any object that allows ox b = A.new(o) h = {a=>5} ph[a] #5 ph[b] #nil, should be 5 ph[o] #nil, should be 5 我试过==,===,eq? 哈希都无济于事。

Ruby:如何在哈希中找到最大值的键?

您好我正在尝试找到哈希值中的最大值。 我在谷歌搜索,我发现这个代码: def largest_hash_key(hash) key = hash.sort{|a,b| a[1] b[1]}.last puts key end hash = { “n” => 100, “m” => 100, “y” => 300, “d” => 200, “a” => 0 } largest_hash_key(hash) 在此代码中,“puts”打印出最大的键和值ex y300。 那么,我如何修改代码以找到最大值并将其键入to_s变量?

如何在YAML文件的顶部删除“—”?

我正在修改Ruby中的YAML文件。 在我回写修改后的YAML后,我看到—添加在文件顶部。 这是如何被添加的,我该如何摆脱它?

如何使用Ruby 2.3中引入的`Array#dig`和`Hash#dig`?

Ruby 2.3在Array和Hash上引入了一种名为dig的新方法。 我在关于新版本的博客文章中看到的例子是人为的,令人费解的: # Hash#dig user = { user: { address: { street1: ‘123 Main street’ } } } user.dig(:user, :address, :street1) # => ‘123 Main street’ # Array#dig results = [[[1, 2, 3]]] results.dig(0, 0, 0) # => 1 我没有使用三嵌套平面数组。 什么是如何有用的现实例子? UPDATE 事实certificate,这些方法解决了一个最常见的Ruby问题。 下面的问题有20个重复,所有这些都是通过使用dig解决的: 如何避免NoMethodError在嵌套哈希中缺少元素,而不重复nil检查? Ruby Style:如何检查嵌套的哈希元素是否存在

将哈希转换为嵌套哈希

这个问题与这个问题相反。 给定一个散列,每个键都有一个数组 { [:a, :b, :c] => 1, [:a, :b, :d] => 2, [:a, :e] => 3, [:f] => 4, } 将它转换为嵌套哈希的最佳方法是什么? { :a => { :b => {:c => 1, :d => 2}, :e => 3, }, :f => 4, }

Ruby中的哈希语法

根据The Well Grounded Rubyist : Ruby允许在哈希键位置使用特殊forms的符号表示,在符号之后使用冒号而不是之前的冒号并删除哈希分隔符箭头。 换句话说,这个: hash = { :name => “David”, :age => 49 } 也可以像这样写: hash = { name: David, age: 49 } 我在ruby 1.8.7和1.9.2中尝试了前面的代码 – 它无法正常工作。 我究竟做错了什么?

双splat运算符破坏性地修改哈希 – 这是一个Ruby错误吗?

我注意到我发现Ruby 2.1.1中的** (双splat)运算符是一个非常令人惊讶的行为。 在**hash之前使用键值对时,哈希保持不变; 但是,当键值对仅在**hash之后使用时,哈希值将被永久修改。 h = { b: 2 } { a: 1, **h } # => { a: 1, b: 2 } h # => { b: 2 } { a: 1, **h, c: 3 } # => { a: 1, b: 2, c: 3 } h # => { b: 2 } […]