Chciałbym zamienić każdy value
w skrócie na value.some_method
.
Na przykład dla danego prostego skrótu:
{"a" => "b", "c" => "d"}`
każda wartość powinna być .upcase
d, więc wygląda to tak:
{"a" => "B", "c" => "D"}
Próbowałem #collect
i #map
zawsze odzyskiwałem tablice. Czy jest na to elegancki sposób?
AKTUALIZACJA
Cholera, zapomniałem: hash znajduje się w zmiennej instancji, której nie należy zmieniać. Potrzebuję nowego skrótu ze zmienionymi wartościami, ale wolałbym nie definiować tej zmiennej jawnie, a następnie zapętlać ją, wypełniając ją. Coś jak:
new_hash = hash.magic{ ... }
Odpowiedzi:
lub, jeśli wolisz zrobić to w sposób nieniszczący i zwrócić nowy hash zamiast modyfikowania
my_hash
:Ta ostatnia wersja ma tę dodatkową zaletę, że możesz również przekształcić klucze.
źródło
each_with_object
to wygodniejsza wersja,inject
kiedy nie chcesz kończyć bloku hashem:my_hash.each_with_object({}) {|(k, v), h| h[k] = v.upcase }
a_new_hash = Hash[ my_hash.map { |k, v| [k, v.upcase] } ]
.to_h
Od
ruby 2.4.0
możesz użyćHash#transform_values
metody natywnej :Jest też
Hash#transform_values!
wersja destrukcyjna .źródło
Możesz zebrać wartości i ponownie przekonwertować je z Array na Hash.
Lubię to:
źródło
To zrobi to:
W przeciwieństwie do
inject
zalet jest to, że nie musisz ponownie zwracać hasha wewnątrz bloku.źródło
Wypróbuj tę funkcję:
źródło
Jest na to metoda w ActiveSupport v4.2.0. Nazywa się
transform_values
i po prostu wykonuje blok dla każdej pary klucz-wartość.Ponieważ robią to za pomocą,
each
myślę, że nie ma lepszego sposobu niż pętla.Aktualizacja:
Od wersji 2.4.0 Rubiego możesz natywnie używać
#transform_values
i#transform_values!
.źródło
Możesz pójść o krok dalej i zrobić to na zagnieżdżonym skrócie. Z pewnością dzieje się to dość często w przypadku projektów Railsowych.
Oto kod zapewniający, że hash parametrów jest w UTF-8:
źródło
Robię coś takiego:
Zapewnia to możliwość przekształcania klucza lub wartości również za pomocą dowolnego wyrażenia (i oczywiście jest to nieniszczące).
źródło
Ruby ma
tap
metodę ( 1.8.7 , 1.9.3 i 2.1.0 ), która jest bardzo przydatna do takich rzeczy.źródło
Specyficzne dla szyn
W przypadku, gdy ktoś potrzebuje tylko wywołać
to_s
metodę do każdej z wartości i nie używa Railsów 4.2 (co zawiera link dotransform_values
metody ), możesz wykonać następujące czynności:Uwaga: wymagane jest użycie biblioteki „json”.
Uwaga 2: Spowoduje to również zmianę kluczy w struny
źródło
Jeśli wiesz, że wartości są łańcuchami, możesz wywołać na nich metodę replace w trakcie cyklu: w ten sposób zmienisz wartość.
Altohugh jest to ograniczone do przypadku, w którym wartości są łańcuchami i dlatego nie odpowiada w pełni na pytanie, pomyślałem, że może to być przydatne dla kogoś.
źródło
źródło