首页 > 解决方案 > 如何从散列数组的散列中查询键值

问题描述

我的数据库中有一个 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"}}

如何从节点内的键中查询和显示特定值?

标签: ruby

解决方案


尚不完全清楚您的意图是什么,但您可以使用以下方法简化对哈希中元素的访问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 等时也是如此。


推荐阅读