Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用数组访问嵌套的哈希键_Ruby - Fatal编程技术网

Ruby 使用数组访问嵌套的哈希键

Ruby 使用数组访问嵌套的哈希键,ruby,Ruby,我有一个字符串数组,它表示嵌套哈希键的路径,例如 ["foo", "bar", "baz"] 我想创建一个函数,它接受数组和一个值,并为数组中提供的键设置值,因此当我用示例调用它时,它会为 Hash[foo][bar][baz] 有没有一种方法可以做到这一点。有没有一种方法可以通过inject将数组元素链接到哈希键调用中 非常感谢您的帮助 具体问题如下: 我有以下代码: def anonymize_data_hash(data, path=[]) if data.is_a?(Hash)

我有一个字符串数组,它表示嵌套哈希键的路径,例如

["foo", "bar", "baz"]
我想创建一个函数,它接受数组和一个值,并为数组中提供的键设置值,因此当我用示例调用它时,它会为

Hash[foo][bar][baz]

有没有一种方法可以做到这一点。有没有一种方法可以通过inject将数组元素链接到哈希键调用中

非常感谢您的帮助

具体问题如下:

我有以下代码:

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_散列方法向序列化散列模式发送methodattribute调用。Path是一个字符串数组。为了使上述函数工作,我需要将字符串数组转换为嵌套的哈希调用

散列已经存在,我需要使用数组中给定的值访问它。
谢谢你的帮助

您可以使用更新的方法ruby 2.3+访问嵌套哈希,然后设置该值:

# 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"}

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

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}}}
由于散列已经存在,我建议正确初始化它的默认进程

如果不可能,您也可以稍后覆盖它

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}}}

我希望这也能对你有所帮助。

看起来很不错。当它在我的rails应用程序中运行时,我会尝试并接受它。你需要解构数组hash.dig*path,注意星号*将数组转换成一个参数列表,用于dig。因此在我的示例中,我将使用send{key}检索哈希并将其保存在区域设置变量中,然后对其调用你的deep_set方法。是的,如果send{key}返回散列对象,顺便说一句,可以是sendkey,除非key可能不是字符串或符号,然后您可以使用deep_setsendkey、path、xxxxxx调用它,当然,您也可以将其保存到局部变量中并将其传递到方法中,但不需要。是的,这是真的。我要补充的另一件事是,我只会设置关键,如果它存在。我正在匿名化的序列化哈希是以表单_数据的形式提交的。所以我不想创建和匿名化不存在的密钥。
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}}}