Manipuler un tableau de tableaux

Salut,

dans un tableau de tableaux je souhaite retrouver le première element en
ne connaissant que le deuxième. Dans le cas suivant, comment récupérer
“key_1” quand on ne connait que “value_1”

MY_ARRAY = [
[“key_1”, “value_1”],
[“key_2”, “value_2”]
]

Y’a bien une solution mais pas très optimisé je trouve:

def my_fonction(value)
for elements in MY_TABLE
(return elements[0]) if elements[1] == value
end
return nil
end

Si vous avez mieux je suis une fois de plus preneur :wink:

Sébastien Grosjean - ZenCocoon

Sébastien :

dans un tableau de tableaux je souhaite retrouver le première
element en ne connaissant que le deuxième. Dans le cas
suivant, comment récupérer “key_1” quand on ne connait que
“value_1”

Est-ce que tu veux récupérer le premier tableau dont le dernier
élément est “value_1” ? ou tous les tableaux dont le dernier élément
est “value 1” ?

MY_ARRAY = [
[“key_1”, “value_1”],
[“key_2”, “value_2”]
]

supposes que tu as :
ary = [ [“key_1”, “value_1”], [“key_2”, “value_2”], [“key_3”, “value_1”]
]

tu veux result = [ [“key_1”, “value_1”] ]
ou result = [ [“key_1”, “value_1”], [“key_3”, “value_1”] ] ?

Y’a bien une solution mais pas très optimisé je trouve:

def my_fonction(value)
for elements in MY_TABLE
(return elements[0]) if elements[1] == value
end
return nil
end

Si vous avez mieux je suis une fois de plus preneur :wink:

Une sous Rails avec group_by :

hash = ary.group_by { |pair| pair.last }

result = hash[‘value2’] # tous
result = hash[‘value2’].first # seulement le premier tableau

Sinon, de manière classique :

result = ary.detect { |pair| pair.last == “value2” } # le premier
result = ary.select { |pair| pair.last == “value2” } # tous

Remarque : ary.find { |pair| pair.last == “value2” }
et ary.find_all { |pair| pair.last == “value2” } marchent aussi
mais préférez #detect et #select sous Rails pour éviter les
confusions avec AR::B#find.

-- Jean-François.

Jean-François wrote :
| >Y’a bien une solution mais pas très optimisé je trouve:
| >
| >def my_fonction(value)
| > for elements in MY_TABLE
| > (return elements[0]) if elements[1] == value
| > end
| > return nil
| >end
| >
| >Si vous avez mieux je suis une fois de plus preneur :wink:
|
| Une sous Rails avec group_by :

Et avec Array.rassoc ??

ri Array.rassoc

Array#rassoc
array.rassoc(key) -> an_array or nil

    Searches through the array whose elements are also arrays.
    Compares key with the second element of each contained array 

using
==. Returns the first contained array that matches. See also
Array#assoc.

       a = [ [ 1, "one"], [2, "two"], [3, "three"], ["ii", "two"] ]
       a.rassoc("two")    #=> [2, "two"]
       a.rassoc("four")   #=> nil

Salut,

Frederick R. wrote:

| >Si vous avez mieux je suis une fois de plus preneur :wink:
Compares key with the second element of each contained array using
==. Returns the first contained array that matches. See also
Array#assoc.

       a = [ [ 1, "one"], [2, "two"], [3, "three"], ["ii", "two"] ]
       a.rassoc("two")    #=> [2, "two"]
       a.rassoc("four")   #=> nil

Tous cela me parait très intérressant, merci Jean-François et Frederick

Sebastien Grosjean - ZenCocoon