Saya ingin mengganti masing-masing value
dalam hash dengan value.some_method
.
Misalnya, untuk diberi hash sederhana:
{"a" => "b", "c" => "d"}`
setiap nilai harus .upcase
d, sehingga terlihat seperti:
{"a" => "B", "c" => "D"}
Saya mencoba #collect
dan #map
tetapi selalu mendapatkan array kembali. Apakah ada cara yang elegan untuk melakukan ini?
MEMPERBARUI
Sial, saya lupa: Hash dalam variabel instan yang tidak boleh diubah. Saya perlu hash baru dengan nilai-nilai yang diubah, tetapi lebih suka tidak mendefinisikan variabel secara eksplisit dan kemudian loop di atas hash mengisinya. Sesuatu seperti:
new_hash = hash.magic{ ... }
Jawaban:
atau, jika Anda lebih suka melakukannya tanpa merusak, dan kembalikan hash baru alih-alih memodifikasi
my_hash
:Versi terakhir ini memiliki manfaat tambahan sehingga Anda dapat mengubah kunci juga.
sumber
each_with_object
adalah versi yang lebih nyamaninject
ketika Anda tidak ingin mengakhiri blok dengan hash: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
Karena
ruby 2.4.0
Anda dapat menggunakanHash#transform_values
metode asli :Ada juga
Hash#transform_values!
versi yang merusak .sumber
Anda dapat mengumpulkan nilai, dan mengonversinya dari Array ke Hash lagi.
Seperti ini:
sumber
Ini akan melakukannya:
Berbeda dengan
inject
keuntungannya adalah Anda tidak perlu mengembalikan hash lagi di dalam blok.sumber
Coba fungsi ini:
sumber
Ada metode untuk itu di ActiveSupport v4.2.0. Ini disebut
transform_values
dan pada dasarnya hanya menjalankan blok untuk setiap pasangan kunci-nilai.Karena mereka melakukannya dengan
each
saya pikir tidak ada cara yang lebih baik selain untuk mengulang.Memperbarui:
Sejak Ruby 2.4.0 Anda dapat menggunakan
#transform_values
dan#transform_values!
.sumber
Anda mungkin ingin melangkah lebih jauh dan melakukan ini pada hash bersarang. Tentu ini terjadi dalam jumlah yang wajar dengan proyek Rails.
Berikut ini beberapa kode untuk memastikan hash params ada di UTF-8:
sumber
Saya melakukan sesuatu seperti ini:
Ini memberi Anda fasilitas untuk mengubah kunci atau nilai melalui ekspresi apa pun juga (dan tentu saja itu tidak merusak).
sumber
Ruby memiliki
tap
metode ( 1.8.7 , 1.9.3 dan 2.1.0 ) yang sangat berguna untuk hal-hal seperti ini.sumber
Khusus untuk rel
Jika seseorang hanya perlu memanggil
to_s
metode ke masing-masing nilai dan tidak menggunakan Rails 4.2 (yang termasuk tautantransform_values
metode ), Anda dapat melakukan hal berikut:Catatan: Penggunaan perpustakaan 'json' diperlukan.
Catatan 2: Ini juga akan mengubah kunci menjadi string
sumber
Jika Anda tahu bahwa nilainya adalah string, Anda dapat memanggil metode ganti pada mereka saat dalam siklus: dengan cara ini Anda akan mengubah nilainya.
Altohugh ini terbatas pada kasus di mana nilainya adalah string dan karenanya tidak menjawab pertanyaan sepenuhnya, saya pikir itu bisa berguna bagi seseorang.
sumber
sumber