首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多个子项哈希转换为非子项

如何将多个子项哈希转换为非子项
EN

Stack Overflow用户
提问于 2016-10-06 16:16:46
回答 3查看 99关注 0票数 0

我想转换一个哈希与许多级别的子项,以哈希只有一个级别。示例:

代码语言:javascript
复制
Input:
{"a1"=>{"a11"=>11, "a12"=>12, "a13"=>13, "a14" => {"a141" => 141} }}

Output:
{"a[a11]" => 11, "a[a12]" => 12, "a[a13]" => 13, "a[a14][a141]" => 141}

如何解决上述问题?

EN

回答 3

Stack Overflow用户

发布于 2016-10-06 16:48:53

哈希键可以是任何对象。我首先将新的key构建为一个数组,然后将其转换回一个字符串:

代码语言:javascript
复制
def convert_keys(in_hash ={})
  in_hash.each_with_object({}) do |(key, value), result|
    if value.is_a?(Hash)
      convert_keys(value).each_pair do |converted_key, converted_value|
        new_key = [ key ] + converted_key
        result[new_key] = converted_value
      end
    else
      result[ [key] ] = value
    end
  end
end

def parse_params(in_hash ={})
  convert_keys(in_hash).each_with_object({}) do |(key, value), result|
    key_postfix = key[1..-1].map { |key_part| "[#{key_part}]" }.join
    str_key =  "#{key[0]}#{key_postfix}"

    result[str_key] = value
  end
end
票数 0
EN

Stack Overflow用户

发布于 2016-10-06 18:09:22

拿去吧:

代码语言:javascript
复制
a = {"a1"=>{"a11"=>11, "a12"=>12, "a13"=>13, "a14" => {"a141" => 141} }}

def modi(hash)
  hash.map do |key, value|
    if value.is_a?(Hash)
      value = modi(value).flatten(1)
      ["[#{key}]" + value.first, value.last]
    else
      ["[#{key}]", value]
    end
  end 
end

def pars(main_hash)
  main_hash.map do |key, value|
    modi(value).each_with_object({}) do |v, res|
      res[v.first.prepend(key.first)] = v.last
    end 
  end.first #*
end 

pars(a)
> {"a[a11]"=>11, "a[a12]"=>12, "a[a13]"=>13, "a[a14][a141]"=>141}

*。或者,您可以删除first方法,然后它返回:

代码语言:javascript
复制
[{"a[a11]"=>11, "a[a12]"=>12, "a[a13]"=>13, "a[a14][a141]"=>141}]

代码语言:javascript
复制
a = {"a1"=>{"a11"=>11, "a12"=>12, "a13"=>13, "a14"=>{"a141"=>141}}, "b1"=>{"b11"=>11}}

然后,如果不使用first,此方法将返回:

代码语言:javascript
复制
[{"a[a11]"=>11, "a[a12]"=>12, "a[a13]"=>13, "a[a14][a141]"=>141,{"b[b11]"=>11}]
票数 0
EN

Stack Overflow用户

发布于 2016-10-07 10:52:15

如果给定上面的输入,您想要的输出是

代码语言:javascript
复制
{"a1[a11]" => 11, "a1[a12]" => 12, "a1[a13]" => 13, "a1[a14][a141]" => 141}

这个方法应该是有效的:

代码语言:javascript
复制
def convert_hash(hash, depth = 0, keys = [], memo = {})
  hash.each do |key, value|
    keys = keys.first(depth) << key
    if value.is_a? Hash
      convert_hash(value, depth + 1, keys, memo)
    else
      head, *tail = keys
      # if there was no typo in your question, then use `head.first` here
      converted_key = tail.reduce(head) { |memo, key| "#{memo}[#{key}]"}
      memo[converted_key] = value
    end
  end
  memo
end

(pry)> convert_hash({"a1"=>{"a11"=>11, "a12"=>12, "a13"=>13, "a14"=>{"a141"=>141}}})
 => {"a1[a11]"=>11, "a1[a12]"=>12, "a1[a13]"=>13, "a1[a14][a141]"=>141}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39890924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档