首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用数组访问嵌套哈希键

使用数组访问嵌套哈希键
EN

Stack Overflow用户
提问于 2018-08-09 18:01:00
回答 2查看 2K关注 0票数 0

我有一个字符串数组,它表示嵌套散列键的路径。

代码语言:javascript
复制
["foo", "bar", "baz"]

我想要创建一个函数,它接受Array和一个值,并为Array中提供的键设置值,所以当我用示例调用它时,它设置了

Hash["foo"]["bar"]["baz"]

有没有办法能做到这一点。是否有方法将Array的元素链接到使用#inject的哈希键调用中?

任何帮助都是非常感谢的。

具体说明以下问题:

我有以下代码:

代码语言:javascript
复制
def anonymize_data_hash(data, path=[])
  if data.is_a?(Hash)
    data.each do |key, value|
      anonymize_data_hash(value, path + [key])
    end
  elsif data.is_a?(Array)
    data.each do |value|
      anonymize_data_hash(value, path)
    end
  else
    path = path.clone
    key = path.shift
    path = (path + [data]).map(&:to_s)

    send("#{key}")[path] = "xxxxxx"
    save
  end
end

anonymize_data_hash方法将一个方法(属性)调用发送到一个模式,该模式是一个序列化的散列。Path是一个字符串数组。为了使上述函数正常工作,我需要将字符串数组转换为嵌套的哈希调用。

哈希已经存在,我需要用数组中给出的值来访问它。谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-09 18:29:43

您可以使用较新的方法Hash#dig (ruby 2.3+)访问嵌套的散列,然后设置该值:

代码语言:javascript
复制
# ideally this might be a method on Hash, so you wouldn't need to pass it in
def deep_set(hash, path, value)
  *path, final_key = path
  to_set = path.empty? ? hash : hash.dig(*path)

  return unless to_set
  to_set[final_key] = value
end

hash = {
  "foo" => {
    "bar" => { }
  }
}

deep_set(hash, ["foo", "bar", "baz"], "xxxxxx")
deep_set(hash, ["baz"], "yyyyyy")
deep_set(hash, ["foo", "baz", "bar"], "zzzzzz")
puts hash
# => {"foo"=>{"bar"=>{"baz"=>"xxxxxx"}}, "baz"=>"yyyyyy"}
票数 9
EN

Stack Overflow用户

发布于 2018-08-09 22:48:50

简单Lime的解决方案首先需要一个格式良好的散列。如果散列的添加取决于此,则高度依赖输入数据及其顺序来确定是否添加了值(例如,示例中的"zzzzzz“)。您可能需要(重新)定义哈希的default_proc,以便动态创建哈希的结构。下面是一个示例:

代码语言:javascript
复制
def nest(array, value)
  hash = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
  hash.dig(*array[0..-2])[array.fetch(-1)] = value
  hash
end

nest ["foo", "bar", "baz"], :test
# => {"foo"=>{"bar"=>{"baz"=>:test}}}

由于散列已经存在,我建议对其default_proc进行适当的初始化。

代码语言:javascript
复制
hash = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }

如果这是不可能的,您还可以在以后重写它。

代码语言:javascript
复制
hash = {}  # unchange initialisation 

hash.default_proc = -> (h, k) { h[k] = Hash.new(&h.default_proc) }

def nest(hash, array, value)
  hash.dig(*array[0..-2])[array.fetch(-1)] = value
  hash
end

nest hash, ["foo", "bar", "baz"], :test
# => {"foo"=>{"bar"=>{"baz"=>:test}}}

我希望你也觉得这有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51773296

复制
相关文章

相似问题

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