0

所以我有一个嵌套哈希,如下所示:

nested_hash = {
  foo: foo,
  bar: {
    foo: foo,
    bar: {
      foo: foo,
      bar: {
        foo: bar
      }
    }
  }
}

要访问不同级别的值,您可以使用多种方法,如下所示:

def one_level(key1)
  nested_hash[key1]
end

def two_levels(key1, key2)
  nested_hash[key1][key2]
end

def three_levels(key1, key2, key3)
  nested_hash[key1][key2][key3]
end

但也许你需要像这样的一种方法:

def up_to_three_levels(key1, key2, key3)
  if key1 && key2 && key3
    nested_hash[key1][key2][key3]
  elif key1 && key2
    nested_hash[key1][key2]
  else
    nested_hash[key1]
  end
end

这显然不是理想的,也不能扩展。如果我可以传递任意长度的数组以达到任意级别,那就太好了。有没有一种方法可以做到这一点?

(对于上下文:我要解决的问题是我需要将键路径作为参数并使用它从多个不同的数据结构中获取数据。)

4

1 回答 1

0

是的。它被称为dig

nested_hash.dig(key1, key2, key3)

它不需要数组,但有一个 splat 运算符 ( *) 可让您将数组转换为参数列表,如下所示:

nested_hash.dig(*[key1, key2, key3])

并不是说您必须自己实现它,但我认为知道这是一个非常简单的递归问题,只需几行代码即可解决,这很有用:

def dig(collection, keys)
    if keys.length == 0 || collection == nil
        collection
    else
        dig(collection[keys[0]], keys.drop(1))
    end
end

另外值得注意的是,它dig也存在于数组中,您可以在嵌套结构中混合使用数组和哈希映射,并使用dig.

于 2021-08-24T14:49:10.683 回答