ruby - 如何从散列数组的散列中查询键值
问题描述
我的数据库中有一个 JSONB 有效负载。此有效负载来自 shopify_api 的 GraphQL 查询。
对于下面的 shop_order,我正在尝试查询节点中第四个订单的名称。
shop_order = {"data":{"orders":{"edges":[{"node":{"id":"gid://shopify/Order/2228134674512","name":"#1001","createdAt":"2020-05-01T18:46:04Z","shippingAddress":{"address1":"1234 Long Avenue, 2N","address2":"","city":"Chicago","province":"Illinois","provinceCode":"IL","zip":"55555"}}},{"node":{"id":"gid://shopify/Order/2239643451472","name":"#1002","createdAt":"2020-05-05T14:40:36Z","shippingAddress":{"address1":"1234 Long Avenue","address2":"2N","city":"Chicago","province":"Illinois","provinceCode":"IL","zip":"55555"}}},{"node":{"id":"gid://shopify/Order/2239950323792","name":"#1003","createdAt":"2020-05-05T16:35:38Z","shippingAddress":{"address1":"1234 Long Avenue","address2":"2N","city":"Chicago","province":"Illinois","provinceCode":"IL","zip":"55555"}}},{"node":{"id":"gid://shopify/Order/2239959105616","name":"#1004","createdAt":"2020-05-05T16:38:27Z","shippingAddress":{"address1":"1234 Long Avenue","address2":"2N","city":"Chicago","province":"Illinois","provinceCode":"IL","zip":"55555"}}}]}},"casted_data":{},"errors":[]}
order = shop_order[:data][:orders][:edges][3]
puts order
response > {:node=>{:id=>"gid://shopify/Order/2239959105616", :name=>"#1004", :createdAt=>"2020-05-05T16:38:27Z", :shippingAddress=>{:address1=>"1234 Long Avenue", :address2=>"2N", :city=>"Chicago", :province=>"Illinois", :provinceCode=>"IL", :zip=>"55555"}}}
order_to_a = shop_order[:data][:orders][:edges][3].to_a
puts order_to_a
response > node
{:id=>"gid://shopify/Order/2239959105616", :name=>"#1004", :createdAt=>"2020-05-05T16:38:27Z", :shippingAddress=>{:address1=>"1234 Long Avenue", :address2=>"2N", :city=>"Chicago", :province=>"Illinois", :provinceCode=>"IL", :zip=>"55555"}}
如何从节点内的键中查询和显示特定值?
解决方案
尚不完全清楚您的意图是什么,但您可以使用以下方法简化对哈希中元素的访问dig
:
shop_order = {
"data": {
"orders": {
"edges": [
{}, {}, {}, {
"node": {
"name": '#1004',
"shippingAddress": {
"zip": '55555'
}
}
}
]
}
}
}
使用以下方式访问数据:
order = shop_order.dig(:data, :orders, :edges)[3]
# => {:node=>{:name=>"#1004", :shippingAddress=>{:zip=>"55555"}}}
或者:
order = shop_order.dig(:data, :orders, :edges, 3)
# => {:node=>{:name=>"#1004", :shippingAddress=>{:zip=>"55555"}}}
如何从节点内的键中查询和显示特定值?
嗯?如果你想要里面的信息order
,做同样的事情:
order.dig(:node, :name) # => "#1004"
order.dig(:node, :shippingAddress, :zip) # => "55555"
或者:
shop_order.dig(:data, :orders, :edges, 3, :node, :name) # => "#1004"
shop_order.dig(:data, :orders, :edges, 3, :node, :shippingAddress, :zip) # => "55555"
很多时候,当我们遍历一个复杂的数组散列时,我们指向一个变量中的数组,然后从那个点开始工作。这类似于将手指放在食谱中的页面上,因此我们可以快速返回。我们在解析 HTML/XML、解析 JSON 和 YAML 等时也是如此。
推荐阅读
- next.js - ENV 处理在 NextJS 和 Mapbox 中不起作用
- java - 带有参数作为按钮的网址(Thymeleaf + Spring boot)
- c++ - 在静态 void 函数中输入没有标识符参数
- python - 将 Snowballstemmer 应用于每个单词的 Pandas 数据框
- python - 使用复杂的初始化测试 Python 对象
- css - CSS 媒体查询打印:
- javascript - 如何使用 nodejs sdk 在 cosmos db 中定义正确的索引路径?
- python - 为什么我在安装 pyautogui 时收到错误“invalid command:bdist_wheel”?
- javascript - 当我第一次进入年份时,JS中的“未捕获的无效公历日期”有什么解决方案吗?
- apache-spark - Spark:Spark API 中是否有与 spark SQL 的 LATERAL VIEW 等效的方法?