He mirado en otras preguntas ASÍ y no encontrar una respuesta para mi problema específico.

Tengo un array:

a = ["a", "b", "c", "d"]

Quiero convertir esta matriz a un hash, donde los elementos de la matriz convertido en las claves del hash y de todos ellos el mismo valor de decir 1. yo.e hash debe ser:

{"a" => 1, "b" => 1, "c" => 1, "d" => 1}

9 Comentarios

  1. 58

    Mi solución, entre otros 🙂

    a = ["a", "b", "c", "d"]
    h = Hash[a.map {|x| [x, 1]}]
    • Probado y funciona con 2.6.3 versión de ruby
  2. 19

    Puede utilizar producto:

    a.product([1]).to_h
    #=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1}

    O también puede utilizar transponer método:

    [a,[1] * a.size].transpose.to_h
    #=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1}
    • wow! esto es tan elegante!
  3. 4
    a = ["a", "b", "c", "d"]

    4 más opciones de lograr el resultado deseado:

    h = a.map{|e|[e,1]}.to_h
    h = a.zip([1]*a.size).to_h
    h = a.product([1]).to_h
    h = a.zip(Array.new(a.size, 1)).to_h

    Todas estas opciones se basan en Matriz#to_h, disponible en Ruby v2.1 o superior

  4. 2
    ["a", "b", "c", "d"].inject({}) do |hash, elem|
      hash[elem] = 1
      hash
    end
    • each_with_object sería un mejor ajuste aquí.
    • Definitivamente sería, pero no es algo que yo he utilizado lo suficiente como para que venga a la mente cuando estoy de codificación. Gracias! :)
    • Yo lo uso mucho, ya que extra valor de retorno en el bloque se ve solitario 🙂
    • Y lo mas importante es que siempre se olvida de ella y, a continuación, obtener undefined method []= en primer :P
  5. 2

    Aquí:

    theHash=Hash[a.map {|k| [k, theValue]}]

    Esto supone que, por su ejemplo de arriba, que a=['a', 'b', 'c', 'd'] y que theValue=1.

    • Usted no necesita la flatten, Hash[] se puede tomar un Array de Arrays.
    • Gracias. Voy a cambiar.
    • Hash[] no parece tener un array de arrays por desgracia: Hash[ [1, 2], [3, 4] ] => {[1, 2]=>[3, 4]}
    • Basta con hacer entonces: Hash[ *[[1, 2], [3, 4]].flatten ]
  6. 0
    a = ['1','2','33','20']
    
    Hash[a.flatten.map{|v| [v,0]}.reverse]
    • Puede dar formato a código seleccionándola y pulsando CTRL+K

Dejar respuesta

Please enter your comment!
Please enter your name here