Mengingat saya memiliki hash klien di bawah ini , apakah ada cara ruby cepat (tanpa harus menulis skrip multi-line) untuk mendapatkan kunci mengingat saya ingin mencocokkan client_id? Misalnya, Bagaimana cara mendapatkan kunci client_id == "2180"
?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
find
danselect
adalah yangfind
mengembalikan kecocokan pertama danselect
(yang disebut denganfindAll
) mengembalikan semua kecocokan.invert
) hanya untuk menemukan item.clients.select{|key, hash| hash["client_id"] == "2180" } # => {"orange"=>{"client_id"=>"2180"}}
clients.select{|key, hash| hash["client_id"] == "2180" }.keys
Ruby 1.9 dan lebih tinggi:
Ruby 1.8 :
Anda bisa menggunakannya
hash.index
Jadi untuk mendapatkan
"orange"
, Anda bisa menggunakan:sumber
index
.Hash#index
berganti nama menjadiHash#key
di Ruby 1.9Anda dapat membalikkan hash.
clients.invert["client_id"=>"2180"]
kembali"orange"
sumber
Anda dapat menggunakan hashname.key (valuename)
Atau, inversi mungkin berurutan.
new_hash = hashname.invert
akan memberi Andanew_hash
yang memungkinkan Anda melakukan hal-hal yang lebih tradisional.sumber
#invert
adalah ide yang sangat buruk dalam hal ini, karena Anda pada dasarnya mengalokasikan memori untuk objek hash yang dibuang hanya demi menemukan kunci. Tergantung pada ukuran hash itu memiliki dampak kinerja yang seriuscoba ini:
sumber
.try(:first)
alih-alih.first
menghindari pengecualian (Jika Anda mengharapkannya mungkin nilai tidak ada).Ruby 2.3.0 +
Anda dapat menggunakan navigator aman&.first
di ujung blok untuk mencegah dari Nil ExceptionMenurut ruby doc, http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key key (nilai) adalah metode untuk menemukan kunci pada basis nilai.
itu akan mengembalikan "desainer".
sumber
Dari dokumen:
Lewati setiap entri di enum untuk diblokir. Mengembalikan blok pertama yang tidak salah. Jika tidak ada objek yang cocok, panggil ifnone dan kembalikan hasilnya saat ditentukan, atau kembalikan nihil sebaliknya.
Jika tidak ada blok yang diberikan, enumerator malah dikembalikan.
Ini bekerja untuk saya:
Lihat: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method
sumber
Cara terbaik untuk menemukan kunci untuk nilai tertentu adalah dengan menggunakan metode kunci yang tersedia untuk ...
Saya harap ini memecahkan masalah Anda ...
sumber
Pendekatan lain yang akan saya coba adalah dengan menggunakan
#map
Ini akan mengembalikan semua kejadian dari nilai yang diberikan. Garis bawah berarti bahwa kita tidak perlu nilai kunci untuk dibawa-bawa sehingga tidak ditugaskan ke variabel. Array akan berisi nils jika nilainya tidak cocok - itu sebabnya saya letakkan
#compact
di akhir.sumber
Inilah cara mudah untuk menemukan kunci dari nilai yang diberikan:
... dan untuk menemukan nilai kunci yang diberikan:
itu akan memberi Anda pasangan nilai kunci.
sumber