【问题标题】:Transform deeply nested ruby hash转换深度嵌套的 ruby​​ 哈希
【发布时间】:2016-10-31 07:32:22
【问题描述】:

我有一个深度嵌套的 Ruby 哈希,我需要将其转换为另一个哈希。一个哈希可能有 0 个或更多的孩子。 这是输入哈希:

"{'id' => 'apple', 'children' => [{'id' => 'ipad', 'children' => [{'id' => 'ipadmini'}]},{'id' => 'ipadmini'}]}"

输出

[{"ipad"=>{"id"=>"ipad", "paths"=>[[{"id"=>"apple"}, {"id"=>"ipad"}]]}},
{"ipadmini"=>{"id"=>"ipadmini", "paths"=>[[{"id"=>"ipad"}, {"id"=>"ipadmini"}], [{"id"=>"apple"}, {"id"=>"ipad"}, {"id"=>"ipadmini"}]]}}, {"apple"=>{"id"=>"apple", "paths"=>[[{"id"=>"apple"}]]}}]

我的代码:

def construct_concept(concept)
    h = {}
    c = Hash[*concept.to_a.first]
    c['paths'] = [[Hash[*concept.to_a.first]]]
    h[concept['id']] = c
    h
end

def parent_child_concepts(concepts)
    pc = {}
    pc[:parent] = Hash[*concepts.first]
    pc[:children] = concepts.values_at('children').flatten.map {|child| parent_child_concepts(child)} || []
    pc
end

def add_parent_child_paths(parent_hash,children_array)
    h = {}
    parent_hash.each do |parent_key,parent_value|
        h[parent_key] = parent_value
        children_array.each do |child|
            child.each do |k,v|
                h[k] = v
                h[k]['paths'].map {|path| path.unshift({'id' => parent_key})}
            end
        end
    end
    h
end

def build_concept_data(concepts)
    #concept {"id"=>"apple", "children"=>[{"id"=>"ipad"}]}
    parsed_concepts = parent_child_concepts(concepts)
    parent = construct_concept(parsed_concepts[:parent])
    children = parsed_concepts[:children].each_with_object([]) {|child,accu| accu << construct_concept(child)}
    concept_paths_data = add_parent_child_paths(parent,children)
end

【问题讨论】:

  • 那么你第一次尝试解决这个问题是什么样的?
  • 最好将这样的代码放入您的问题本身。您可以编辑修改。
  • 你真的有问题吗?我能看到的只是一个让人无法回答的陈述
  • 我无法解决问题。我似乎无法将其转换为必要的输出?任何帮助将不胜感激

标签: ruby algorithm hash


【解决方案1】:
def build_data(node, ctx = [], result = [])
  id = node['id']
  children = node['children']

  branch = result.find{|h| h.has_key?(id)}
  if branch.nil?
    result.push({
      id => {
        'id' => id,
        'paths' => []
      }
    })
  end
  branch = result.find{|h| h.has_key?(id)}
  branch[id]['paths'].unshift(
    [ctx, id].flatten.map do |ctx_id|
      {
        'id' => ctx_id
      }
    end
  )

  if children.is_a?(Array)
    children.each do |node|
      new_ctx = ctx.dup
      new_ctx.push(id)
      nesting(node, new_ctx, result)
    end
  end

  result
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2019-08-01
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多