过滤一个嵌套json为一个特定的飞行和返回相邻的成员在ruby



我有一个如下结构的API响应

{
"id": "123342-123412",
"data": [
{
"id": "ace123",
"name": "Tom",
"files": [
{
"color": "yellow",
"file_id": "245"
},
{
"color": "red",
"file_id": "233"
}
]
},
{
"id": "asd123",
"name": "Jerry",
"files": [
{
"color": "red",
"file_id": "210"
},
{
"color": "green",
"file_id": "221"
}
]
},
{
"id": "acs123",
"name": "Barbie",
"files": [
{
"color": "green",
"file_id": "201"
}
]
}
]
}

我是新的ruby,我想过滤掉所有的文件id与颜色红色除了使用

遍历整个JSON之外,还有什么更好的方法?
data.each do  | object| 
# individual element search code 
end

我正在使用ruby版本2.6

我想到的单行版本是:

json[:data].map {|d| d[:files] }.flatten.select {|f| f[:color] == 'red' }.map {|f| f[:file_id] }
=> ["233", "210"]

但是这个迭代多次(每次方法调用一次),更不用说它对我来说有点神秘了。
我个人更喜欢一个详细的版本,它清楚地说明了如何获得值:

file_ids = []
json[:data].each do |data| 
data[:files].each do |file| 
next if file[:color] != 'red'
file_ids << file[:file_id]
end
end
file_ids.uniq # In case you have duplicates

但这取决于你用什么。

最新更新