【问题标题】:Find multiple objects in nested hash在嵌套哈希中查找多个对象
【发布时间】:2014-12-12 06:57:25
【问题描述】:

我正在从 Facebook 获取嵌套哈希。它有数组,里面有更多的哈希值,反之亦然。

现在我正在尝试查找深度嵌套的哈希的每一次出现。

在我的情况下,我正在搜索具有键“标签”的每个值,然后将其推送到数组中。

我在“Find key/value pairs deep inside a hash containing an arbitrary number of nested hashes and arrays”中找到了唯一键的解决方案。

当键不是唯一的时候我怎么能做同样的事情并将每个结果推入一个数组?

编辑:

这是我从 facebook graph api 获得的示例响应。

{"albums"=>{"data"=>[{"id"=>"1406826642942218", 
"created_time"=>"2014-12-11T10:54:13+0000", 
"photos"=>{"data"=>[{"created_time"=>"2014-12-11T10:54:13+0000",
 "id"=>"1406826626275553"}], 
"paging"=>{"cursors"=>{"before"=>"MTQwNjgyNjYyNjI3NTU1Mw==", "after"=>"MTQwNjgyNjYyNjI3NTU1Mw=="}}}},
 {"id"=>"1406825849608964", 
"created_time"=>"2014-12-11T10:52:34+0000", 
"photos"=>{"data"=>[{"created_time"=>"2014-12-11T10:52:34+0000", 
"id"=>"1406825782942304"}], 
"paging"=>{"cursors"=>{"before"=>"MTQwNjgyNTc4Mjk0MjMwNA==", "after"=>"MTQwNjgyNTc4Mjk0MjMwNA=="}}}},
 {"id"=>"1405097859781763",
 "created_time"=>"2014-12-08T14:50:51+0000"
, "photos"=>{"data"=>[{"created_time"=>"2014-12-08T14:51:12+0000", "id"=>"1405097983115084"}],
 "paging"=>{"cursors"=>{"before"=>"MTQwNTA5Nzk4MzExNTA4NA==", "after"=>"MTQwNTA5Nzk4MzExNTA4NA=="}}}},
 {"id"=>"1392256877732528",
 "created_time"=>"2014-11-17T14:37:00+0000",
 "photos"=>{"data"=>[{"created_time"=>"2014-12-08T14:24:41+0000", 
"id"=>"1405084986449717"}, 
{"tags"=>{"data"=>[{"id"=>"100007516267052",
 "name"=>"Dorothy Amgeafbfgjeb Qinman",
 "created_time"=>"2014-11-17T14:37:12+0000",
 "x"=>46.604215456674, "y"=>72.330827067669}, 
{"id"=>"100007456544855", 
"name"=>"Richard Amgdefeddhee Carrierosen",
 "created_time"=>"2014-11-17T14:37:11+0000",
 "x"=>45.433255269321, "y"=>48.571428571429}, 
{"id"=>"100008446877693", 
"name"=>"Karen Amhddfhggfic Chaison",
 "created_time"=>"2014-11-17T14:37:09+0000",
 "x"=>49.414519906323, "y"=>31.578947368421}],
 "paging"=>{"cursors"=>{"before"=>"MTAwMDA3NTE2MjY3MDUy", "after"=>"MTAwMDA4NDQ2ODc3Njkz"}}},
 "created_time"=>"2014-11-17T14:37:01+0000",
 "id"=>"1392256757732540"}], 
"paging"=>{"cursors"=>{"before"=>"MTQwNTA4NDk4NjQ0OTcxNw==", "after"=>"MTM5MjI1Njc1NzczMjU0MA=="}}}}],
 "paging"=>{"cursors"=>{"after"=>"MTM5MjI1Njg3NzczMjUyOA==", "before"=>"MTQwNjgyNjY0Mjk0MjIxOA=="}}},
 "id"=>"100008446877693"}

我想要的是这部分

{"tags"=>{"data"=>[{"id"=>"100007516267052",
     "name"=>"Dorothy Amgeafbfgjeb Qinman",
     "created_time"=>"2014-11-17T14:37:12+0000",
     "x"=>46.604215456674, "y"=>72.330827067669}, 
    {"id"=>"100007456544855", 
    "name"=>"Richard Amgdefeddhee Carrierosen",
     "created_time"=>"2014-11-17T14:37:11+0000",
     "x"=>45.433255269321, "y"=>48.571428571429}, 
    {"id"=>"100008446877693", 
    "name"=>"Karen Amhddfhggfic Chaison",
     "created_time"=>"2014-11-17T14:37:09+0000",
     "x"=>49.414519906323, "y"=>31.578947368421}],

这可能在多个位置,具体取决于有多少图片上有标签。

我希望这会让它更清楚。

【问题讨论】:

  • 给我们一个这个嵌套散列和期望输出的例子
  • 你还没有给我们任何工作。我们需要您的最小输入样本、您预期的输出样本,以及您尝试编写的用于演示您所遇到问题的最小示例。没有这个,你的问题就可以结束了。
  • 提供嵌套散列会给你什么信息?这个问题非常清楚。
  • 我们知道嵌套哈希是什么。我们不知道 OP 的输入数据是什么样的,因为它深深地嵌套在数组中。我们可以想象有很多数据格式可以满足该描述,并且大多数与问题无关,因此由 OP 提供一些缩小范围的东西。
  • 我们可以想象有很多数据格式可以满足该描述,并且大多数与问题无关为什么不呢?

标签: ruby-on-rails ruby arrays hash


【解决方案1】:
def nested_hash_values(obj,key)
  r = []  
  if obj.is_a?(Hash)        
    r.push(obj[key]) if obj.key?(key) 
    obj.each_value { |e| r += nested_hash_values(e,key) }
  end
  if obj.is_a?(Array)
    obj.each { |e| r += nested_hash_values(e,key) }
  end
  r
end

a = {"foo"=>["bar", "x", {"bar"=>["hello", {"foo"=>"world"}, "world!"], "foo"=>"BAR!"}, "enough?"], "bar"=>"foo"}
nested_hash_values(a, "foo")
=> [["bar", "x", {"bar"=>["hello", {"foo"=>"world"}, "world!"], "foo"=>"BAR!"}, "enough?"], "BAR!", "world"]

应该返回一个数组,其中包含为给定键找到的所有值。

您可以在每个块中添加额外的if e.is_a?(Array) || e.is_a?(Hash)。这将避免不必要的方法调用并加快函数速度,但会添加额外的代码。

【讨论】:

  • 非常感谢。这正是我需要的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
相关资源
最近更新 更多