2012-05-14 41 views
24

Giả sử tôi có mảng này băm:của Ruby dễ dàng tìm kiếm các cặp khóa-giá trị trong một mảng băm

[ 
{"href"=>"https://company.campfirenow.com", "name"=>"Company", "id"=>123456789, "product"=>"campfire"}, 
{"href"=>"https://basecamp.com/123456789/api/v1", "name"=>"Company", "id"=>123456789, "product"=>"bcx"}, 
{"href"=>"https://company.highrisehq.com", "name"=>"Company", "id"=>123456789, "product"=>"highrise"} 
] 

Làm thế nào tôi có thể phân tích "href" giá trị của băm nơi "sản phẩm" => "bcx"

Có cách nào dễ dàng để thực hiện việc này trong Ruby không?

+1

Đã chỉnh sửa câu hỏi vì nó không liên quan gì đến JSON. –

Trả lời

49
ary = [ 
    {"href"=>"https://company.campfirenow.com", "name"=>"Company", "id"=>123456789, "product"=>"campfire"}, 
    {"href"=>"https://basecamp.com/123456789/api/v1", "name"=>"Company", "id"=>123456789, "product"=>"bcx"}, 
    {"href"=>"https://company.highrisehq.com", "name"=>"Company", "id"=>123456789, "product"=>"highrise"} 
] 

p ary.find { |h| h['product'] == 'bcx' }['href'] 
# => "https://basecamp.com/123456789/api/v1" 

Lưu ý rằng điều này chỉ hoạt động nếu phần tử tồn tại. Nếu không, bạn sẽ được gọi các nhà điều hành thuê bao [] trên nil, mà sẽ nâng cao một ngoại lệ, vì vậy bạn có thể muốn kiểm tra cho rằng đầu tiên:

if h = ary.find { |h| h['product'] == 'bcx' } 
    p h['href'] 
else 
    puts 'Not found!' 
end 

Nếu bạn cần phải thực hiện mà hoạt động nhiều lần, bạn nên xây dựng cho mình một cấu trúc dữ liệu để tra cứu nhanh hơn:

href_by_product = Hash[ary.map { |h| h.values_at('product', 'href') }] 
p href_by_product['campfire'] # => "https://company.campfirenow.com" 
p href_by_product['bcx']  # => "https://basecamp.com/123456789/api/v1" 
+3

+1 cho đề xuất băm. –

+1

Hoàn hảo! Không biết .find là một phương pháp bạn có thể gọi. Thực sự hữu ích. –

+6

@BrianW: Quy tắc số 1 của Lập trình Ruby: tìm hiểu các phương thức của 'Số đếm'. Sau đó, tìm hiểu chúng một lần nữa. –

Các vấn đề liên quan