Supongamos que tengo de esta serie de hashes:

[
{"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"}
]

¿Cómo puedo analizar el «href» valor de hash donde «producto»=>»bcx»

Es hay alguna forma fácil de hacer esto en Ruby?

  • Editado la pregunta porque no tiene nada que ver con JSON.

1 Comentario

  1. 50
    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"

    Tenga en cuenta que esto sólo funciona si el elemento existe. De lo contrario te va a estar llamando a la suscripción del operador [] en nil, lo que provocará una excepción, así que usted puede ser que desee comprobar de primera:

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

    Si usted necesita para realizar esta operación varias veces, usted debe construir una estructura de datos para agilizar la búsqueda:

    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"
    • +1 para el hash de la sugerencia.
    • Perfecto! No conocía .es un método que se podría llamar. Realmente ayuda.
    • Regla #1 de Programación Ruby: aprender los métodos de Enumerable. Entonces, aprender de nuevo.
    • pequeñeces: find/detectar + obtener tiene el típico problema de la falta de coincidencia + auge. Así que en Ruby, al no tener la lista de comprensión integrada, yo iba a escribir, cuando se utiliza ick: ary.detect { |h| h['product'] == 'bcx' }.maybe['href']. Cuando se utiliza facetas: ary.map_detect { |h| h["href"] if h['product'] == 'bcx' }
    • Claro, esto sólo funciona si el elemento existe. Que era una suposición mía que no he estado explícitamente, gracias por señalándolo.

Dejar respuesta

Please enter your comment!
Please enter your name here