Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 hashie gem进行深度删除?_Ruby - Fatal编程技术网

有没有办法使用ruby hashie gem进行深度删除?

有没有办法使用ruby hashie gem进行深度删除?,ruby,Ruby,hashie有一个deep_find_all方法,可以用来查找嵌套哈希中的所有键,但是有没有一种方法可以执行deep delete或deep find,以可以删除的方式返回键 我知道我可以在哪里将散列转换成mashie并进行删除,但它似乎没有超出顶层 我试图从JSON中删除包含时间戳的所有键,以便比较来自两个不同主机的结果。我已经实现了一种方法来实现它,但它似乎有点笨拙,而深度删除就是其中之一 谢谢 Craig您可以创建一个通用的ruby方法: def hash_recurse(hash, &a

hashie有一个deep_find_all方法,可以用来查找嵌套哈希中的所有键,但是有没有一种方法可以执行deep delete或deep find,以可以删除的方式返回键

我知道我可以在哪里将散列转换成mashie并进行删除,但它似乎没有超出顶层

我试图从JSON中删除包含时间戳的所有键,以便比较来自两个不同主机的结果。我已经实现了一种方法来实现它,但它似乎有点笨拙,而深度删除就是其中之一

谢谢
Craig

您可以创建一个通用的ruby方法:

def hash_recurse(hash, &blk)
  hash.each do |key, val|
    blk.call(hash, key, val)
    if val.is_a?(Hash)
      hash_recurse(val, &blk)
    end
  end
end
然后可以传递任何块,包括要删除的块:

hash = {
  a: {
    timestamp: 123,
    key: "val1"
  },
  b: {
    timestamp: 456,
    foo: "val2"
  }
}

hash_recurse(hash) do |_hash, key, val|
  _hash.delete(key) if key == :timestamp
end

puts hash
# => {:a=>{:key=>"val1"}, :b=>{:foo=>"val2"}}
这与深度优先搜索基本相同。例如,如果要提取散列及其子散列中所有键的“路径”,可以对其进行修改以保留当前路径的记录:

def hash_recurse(hash, path=[], &blk)
  hash.each do |key, val|
    new_path = path + [key]
    blk.call(hash, key, val, new_path)
    if val.is_a?(Hash)
      hash_recurse(val, new_path, &blk)
    end
  end
end
并按如下方式获取路径:

paths = []
hash_recurse(hash) do |_hash, key, val, path|
  paths << path
end

paths.each { |path| puts path.join(",") }
# =>
#    a
#    a,timestamp
#    a,key
#    b
#    b,timestamp
#    b,foo
路径=[]
hash_recurse(hash)do|u hash,key,val,path|
路径
#a
#时间戳
#a,钥匙
#b
#b,时间戳
#b,福