【问题标题】:Ruby: Turn array into nested pointer [closed]Ruby:将数组转换为嵌套指针
【发布时间】:2017-05-28 12:41:47
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 您的哈希不是有效的 Ruby 代码。另外,为什么hash.keys[1] 指的是:ab0 而不是:ad1
  • 也许你可以选择一个不同的示例哈希,重复的键名会很混乱。
  • 为什么最后一个0 被忽略了?最后不应该有hash[1].keys[0].keys[0].keys[0]吗?键也是散列吗?
  • 最后但同样重要的是:您的预期结果是什么?对于[1,0,0,0] 的输入,您给出了一个包含 3 个(为什么?)元素的数组:hash.keys[1]hash.keys[1].keys[0]hash[1].keys[0].keys[0],但只有第一个元素会产生结果。也许第二个元素应该是hash[hash.keys[1]].keys[0]?请澄清。
  • 链接问题从数组创建嵌套哈希。如果我理解正确,你想要的正好相反。我什至不确定,因为你的标题也描述了你的问题的反面。

标签: arrays ruby pointers hash nested


【解决方案1】:

数组到嵌套哈希

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

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]

【讨论】:

  • 谢谢!我很抱歉这个问题不是很清楚。但是,您的回答成功了。我现在可以给出一个 Hash 和一个 Pointer 数组,并得到一个遍历键的数组以获取指针。
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多