Arrays Ruby:根据条件从深度嵌套的JSON结构中提取元素

Arrays Ruby:根据条件从深度嵌套的JSON结构中提取元素,arrays,json,ruby,hash,Arrays,Json,Ruby,Hash,要从每个具有marketName==“Moneyline”的市场提取每个marketID。尝试了.maps、.rejects和/或的几种组合。选择s但无法缩小范围,因为复杂的结构让我感到困惑 在事件中有许多市场,也有许多事件。结构的一个示例(为了简洁起见,尝试对其进行编辑): 试过各种各样的东西,比如 markets = json["eventTypes"].first["eventNodes"].map {|e| e["marketNodes"].map { |e| e["marketId"]

要从每个具有
marketName==“Moneyline”
的市场提取每个
marketID
。尝试了
.map
s、
.reject
s和/或
的几种组合。选择
s但无法缩小范围,因为复杂的结构让我感到困惑

事件中有许多
市场
,也有许多
事件
。结构的一个示例(为了简洁起见,尝试对其进行编辑):

试过各种各样的东西,比如

markets = json["eventTypes"].first["eventNodes"].map {|e| e["marketNodes"].map { |e| e["marketId"] } if (e["marketNodes"].map {|e| e["marketName"] == 'Moneyline'})}
markets.flatten
# => yields every marketId not every marketId with marketName of 'Moneyline'
在没有其他信息的情况下,从Moneyline markets获得每个marketId的简单数组就足够了。如果愿意,使用Rails方法也可以

抱歉,如果我的编辑弄乱了语法。在解析JSON之后,它看起来只有
=>
而不是


谢谢大家!

我喜欢嵌套贴图并选择:D

require 'json'

hash = JSON.parse(File.read('data.json'))

moneyline_market_ids = hash["eventTypes"].map{|type|
  type["eventNodes"].map{|node|
    node["marketNodes"].select{|market|
      market["description"]["marketName"] == 'Moneyline'
    }.map{|market| market["marketId"]}
  }
}.flatten

puts moneyline_market_ids.join(', ')
#=> 1.128255531, 1.128272164, 1.128255516, 1.128272159, 1.128278718, 1.128272176, 1.128272174, 1.128272169, 1.128272148, 1.128272146, 1.128255464, 1.128255448, 1.128272157, 1.128272155, 1.128255499, 1.128272153, 1.128255484, 1.128272150, 1.128255748, 1.128272185, 1.128278720, 1.128272183, 1.128272178, 1.128255729, 1.128360712, 1.128255371, 1.128255433, 1.128255418, 1.128255403, 1.128255387

只是为了好玩,这里有另一个可能的答案,这次是regexen。它较短,但根据您的输入数据可能会中断。它直接以字符串形式读取json数据:

json = File.read('data.json')

market_ids   = json.scan(/(?<="marketId":")[\d\.]+/)
market_names = json.scan(/(?<="marketName":")[^"]+/)

moneyline_market_ids = market_ids.zip(market_names).select{|id,name| name=="Moneyline"}.map{|id,_| id}
puts moneyline_market_ids.join(', ')
#=> 1.128255531, 1.128272164, 1.128255516, 1.128272159, 1.128278718, 1.128272176, 1.128272174, 1.128272169, 1.128272148, 1.128272146, 1.128255464, 1.128255448, 1.128272157, 1.128272155, 1.128255499, 1.128272153, 1.128255484, 1.128272150, 1.128255748, 1.128272185, 1.128278720, 1.128272183, 1.128272178, 1.128255729, 1.128360712, 1.128255371, 1.128255433, 1.128255418, 1.128255403, 1.128255387
json=File.read('data.json'))

market_id=json.scan(/(?不要使用外部资源。这是在rails应用程序中,所以ruby或rails方法有语法正确的示例吗?@EricDumini如果我的编辑把它弄糟了,我很抱歉。请看这里:在我的控制台中,它基本上看起来就像那样,只是在解析后使用
=>
而不是
。有点凌乱。yowza。完美。Tha谢谢你!我的头在想办法弄明白。嘿@eric duminil,如果你有一分钟的时间,我这里有一个更具挑战性的脑筋急转弯。来源:。我想选择
marketIds=='Moneyline'
,但只有那些
countryCode='US'.\124;'GB'
eventName.包括?('@')
。(
space
@
之前和之后)。我尝试了
map
select
的不同组合,但有些节点没有使事情复杂化的“countryCode”。这两个标准有些重叠,因此可能需要
uniq
。TIA!请写另一个问题。对!非常感谢!
json = File.read('data.json')

market_ids   = json.scan(/(?<="marketId":")[\d\.]+/)
market_names = json.scan(/(?<="marketName":")[^"]+/)

moneyline_market_ids = market_ids.zip(market_names).select{|id,name| name=="Moneyline"}.map{|id,_| id}
puts moneyline_market_ids.join(', ')
#=> 1.128255531, 1.128272164, 1.128255516, 1.128272159, 1.128278718, 1.128272176, 1.128272174, 1.128272169, 1.128272148, 1.128272146, 1.128255464, 1.128255448, 1.128272157, 1.128272155, 1.128255499, 1.128272153, 1.128255484, 1.128272150, 1.128255748, 1.128272185, 1.128278720, 1.128272183, 1.128272178, 1.128255729, 1.128360712, 1.128255371, 1.128255433, 1.128255418, 1.128255403, 1.128255387