ruby - 根据子哈希值从哈希中选择项目
问题描述
我有来自 API 的以下 JSON 输出:
{
"Objects": [
{
"FieldValues": [
{
"Field": {
"Name": "Nuix Field"
},
"Value": "Primary Date"
},
{
"Field": {
"Name": "Field Type"
},
"Value": {
"Name": "Nuix"
}
},
{
"Field": {
"Name": "Field Category"
},
"Value": {
"Name": "Generic"
}
}
]
}
]
}
我希望能够选择所有Objects
“字段”具有“字段类型”的“名称”并且它的“值”具有“Nuix”的“名称”。
这是我的尝试,但我觉得有更好的方法吗?
json = JSON.parse(response)
results = []
json["Objects"].each do |obj|
obj["FieldValues"].each do |fv|
if fv["Field"]["Name"] == "Field Type" && fv["Value"]["Name"] == "Nuix"
results << obj
end
end
end
解决方案
选项之一是不循环所有FieldValues
,而仅在使用该any?
方法找到预期的循环之前。
然后您可以使用方法简化代码select
,该方法将创建仅包含“满意”对象的新数组。
objects_with_required_fields = json.fetch("Objects", []).select do |obj|
obj.fetch("FieldValues", []).any? do |fv|
name = fv.dig("Field", "Name")
value = fv["Value"]
name == "Field Type" && value.is_a?(Hash) && value["Name"] == "Nuix"
end
end
推荐阅读
- php - 是什么导致 Session 值从插入的值发生变化?
- c# - C#用随机生成的字符串替换每个单词
- unit-testing - Karma-Jasmine:加载过程中出错
- excel - VBA - 添加计数器进行跟踪
- jquery - 如何用 CSS 实现这种“高亮”效果?
- python - Matplotlib 从二维 numpy 数组列表中绘制 pmf
- r - 在函数中多次使用 R 中的替换
- docker - docker 注册表和 nginx - 实体太大 - client_max_body_size 没有效果
- r - 通过R运行一个exe文件
- url - 如何在响应正文中返回 access_token 而不是在 url 中返回 #access_token?