Ruby:将数组转换为嵌套指针

时间:2017-01-13 07:40:48

标签: arrays ruby pointers hash nested

this question非常相似,但在Ruby中。

我有一个嵌套的哈希(下面是一个非文字的例子),我有一个指向我最深的子值的数组:

ab0:
  ad1:
    ab0:
      ad1: {}
ad1:
  ab0:
    ad1:
      ab0: {}

指向最后一个键“ab0”的数组是[1,0,0,0]。我想通过指向hash [1] [0] [0] [0]来使用这个数组来遍历哈希。

我将有希望使用这个来获取有关孩子的路径上使用的每个密钥。我的结果应该是:

keysUsed(hash, [1,0,0,0]) = [hash.keys[1], hash.keys[1].keys[0], hash[1].keys[0].keys[0]]

1 个答案:

答案 0 :(得分:0)

要嵌套哈希的数组

以下是您标题中问题的答案以及您提供的链接:

def to_nested_hash(array)
  array.reverse.inject { |h, k| { k => h } }
end

hash1 = to_nested_hash([:a, :b, :c, :d])
#=> {:a=>{:b=>{:c=>:d}}}

嵌套哈希到数组

def path_from_nested_hash(hash, indices)
  path = []
  indices.inject(hash){ |h, i|
    case h
    when Hash
      path << h.keys[i]
      h.values[i] || {}
    when Array
      path << h[i]
      h[i]
    else
      path << h
    end
  }
  path
end

path_from_nested_hash( hash1.merge(hash2), [0,0,0,0])
# [:a, :b, :c, :d]
path_from_nested_hash( hash1.merge(hash2), [1,0,0,0])
# [:e, :f, :g, :h]
path_from_nested_hash( hash1.merge(hash2), [1,1,0,0])
# [:e, nil, nil, nil]