Saya memiliki objek JavaScript yang cukup sederhana, yang saya gunakan sebagai array asosiatif. Apakah ada fungsi sederhana yang memungkinkan saya untuk mendapatkan kunci untuk suatu nilai, atau apakah saya harus mengulangi objek dan menemukannya secara manual?
javascript
object
arik
sumber
sumber
var o = []; var map = {first: o, second: o}
. Apa yang akanfind_key(o)
kembali?Jawaban:
Dengan perpustakaan Underscore.js :
sumber
_.chain(hash).pairs().findWhere({1: 1}).value()[0]
ES6, tidak ada mutasi prototipe atau perpustakaan eksternal.
Contoh,
sumber
keys()
mematerialisasi set kunci.function getKeyByValue(object, value) { return Object.keys(object).filter(key => object[key] === value); }
Tidak ada metode standar yang tersedia. Anda perlu mengulang dan Anda dapat membuat pembantu sederhana:
Satu kata peringatan : Sekalipun di atas berfungsi, umumnya merupakan ide yang buruk untuk memperpanjang host atau objek asli
.prototype
. Saya melakukannya di sini karena sangat cocok dengan masalah ini. Bagaimanapun, Anda mungkin harus menggunakan fungsi ini di luar.prototype
dan meneruskan objek ke dalamnya.sumber
.toString()
sepertiobj[ key ].toString()
dan ke nilai jika diinginkan ...Seperti yang dikatakan, iterasi diperlukan. Misalnya, di browser modern Anda dapat memiliki:
Di mana
value
berisi nilai yang Anda cari. Mengatakan itu, saya mungkin akan menggunakan loop.Kalau tidak, Anda bisa menggunakan objek "hashmap" yang tepat - ada beberapa implementasi di sekitar JS - atau diimplementasikan oleh Anda sendiri.
PEMBARUAN 2018
Enam tahun berlalu, tapi saya masih mendapatkan suara di sini, jadi saya merasa seperti solusi yang lebih modern - untuk browser / lingkungan modern - harus disebutkan dalam jawaban itu sendiri dan bukan hanya di komentar:
Tentu saja itu bisa juga fungsi:
sumber
Object.keys(obj).or(o=>o[key] === value)
or
array metode, dan tidak jelas bagi saya tujuannya di sini: Saya akan menghargai beberapa detail tambahan! :)or
pasti! Itu baru-baru ini dievaluasi dan diterima (saya pikir belum ada yang mengimplementasikannya). Apa yang dilakukannya adalah menemukan elemen pertama dari array yang cocok dengan predikat dan mengembalikannya. Jadi[1,2,3,4].or(x=>x>2)
akan kembali3
dan[1,2,3,4,5].or(x=>x<3)
akan kembali1
. Sesuatu seperti FirstOrDefault C # :)or
metode ini? Dari apa yang Anda sebutkan tampaknya mengembalikan item yang cocok dengan predikat "atau" array itu sendiri?or
diganti namanya. Saya percaya sekarang Anda harus menggunakan find .Cara lodash https://lodash.com/docs#findKey
sumber
_.findKey(users, { 'age': 1, 'active': true });
... itu sama_.find_key({a: "A", b:"B"}, "B"})
pengembalianundefined
jadi seperti yang dinyatakan di sini yang perlu Anda lakukan_.find_key({a: "A", b:"B"}, _.partial(_.isEqual,"B")})
_.invert(haystack)[needle]
Dibuat untuk kompilator penutupan untuk mengekstrak nama kunci yang tidak akan diketahui setelah kompilasi
Versi yang lebih seksi tetapi menggunakan
Object.entries
fungsi masa depansumber
Object.entries(obj).find(i => i[1] === val);
gunakanfilter
sebagai gantinyaObject.entries(obj).filter(i => i[1] === val);
Object.entries(obj).find( ([ key, value ]) => value === val);
ES6 + One Liners
Kembalikan semua kunci dengan nilai:
sumber
Saya menggunakan fungsi ini:
Pemakaian:
sumber
obj.hasOwnProperty(key)
atau tidak perlu dalam kasus ini?Fungsi utama:
Objek dengan kunci dan nilai:
Uji:
sumber
Object.keys(greetings )[Object.values(greetings ).indexOf('привіт')]
Contoh:
sumber
Jika Anda bekerja dengan Underscore atau Lodash library, Anda dapat menggunakan fungsi _.findKey :
sumber
Saya membuat perpustakaan bimap ( https://github.com/alethes/bimap ) yang mengimplementasikan antarmuka peta dua arah JavaScript yang kuat, fleksibel, dan efisien. Ia tidak memiliki dependensi dan dapat digunakan baik di sisi server (di Node.js, Anda dapat menginstalnya dengan
npm install bimap
) maupun di browser (dengan menautkan ke lib / bimap.js ).Operasi dasar sangat sederhana:
Pengambilan pemetaan nilai-kunci sama cepatnya di kedua arah. Tidak ada traversal objek / array yang mahal di bawah kap sehingga waktu akses rata-rata tetap konstan terlepas dari ukuran data.
sumber
tidak melihat yang berikut:
sumber
Karena nilai-nilai itu unik, harus dimungkinkan untuk menambahkan nilai-nilai sebagai seperangkat kunci tambahan. Ini bisa dilakukan dengan cara pintas berikut.
Ini akan memungkinkan pengambilan baik melalui kunci atau nilainya:
Ini mengasumsikan bahwa tidak ada elemen umum antara kunci dan nilai.
sumber
Diberikan
input={"a":"x", "b":"y", "c":"x"}
...output={"x":"a","y":"b"}
):output={"x":"c","y":"b"}
):output={"x":["c","a"],"y":["b"]}
):sumber
output['x']
. Itukah yang kamu tanyakan?http://jsfiddle.net/rTazZ/2/
sumber
Atau, lebih mudah lagi - buat objek baru dengan kunci dan nilai-nilai dalam urutan yang Anda inginkan kemudian lihatlah terhadap objek itu. Kami mengalami konflik menggunakan kode prototipe di atas. Anda tidak harus menggunakan fungsi String di sekitar tombol, itu opsional.
sumber
Ini adalah ekstensi kecil untuk metode Underscorejs, dan menggunakan Lodash sebagai gantinya:
FindKey akan mencari dan mengembalikan kunci pertama yang cocok dengan nilainya.
Jika Anda menginginkan pertandingan terakhir sebagai gantinya, gunakan FindLastKey sebagai gantinya.
sumber
Seolah pertanyaan ini belum dikalahkan hingga bubur ...
Inilah satu hanya untuk rasa ingin tahu apa pun yang membawa Anda ...
Jika Anda yakin bahwa objek Anda hanya akan memiliki nilai string, Anda dapat benar-benar menghabiskan diri untuk menyulap implementasi ini:
Mungkin ada sesuatu yang berguna untuk dibangun dari sini ...
Semoga ini menghibur Anda.
sumber
Inilah solusi Lodash untuk ini yang berfungsi untuk objek nilai kunci datar =>, daripada objek bersarang. Saran jawaban yang diterima untuk menggunakan
_.findKey
karya untuk objek dengan objek bersarang, tetapi itu tidak berfungsi dalam keadaan umum ini.Pendekatan ini membalikkan objek, menukar kunci untuk nilai, dan kemudian menemukan kunci dengan mencari nilai pada objek baru (terbalik). Jika kunci tidak ditemukan maka
false
dikembalikan, yang saya sukaiundefined
, tetapi Anda dapat dengan mudah menukar ini di parameter ketiga_.get
metode digetKey()
.sumber
Ini solusinya dulu:
Sebagai contoh, saya kira kita memiliki objek yang berisi tiga pasangan nilai:
Kita cukup menulis findKey (array, value) yang mengambil dua parameter yang merupakan objek dan nilai kunci yang Anda cari. Dengan demikian, metode ini dapat digunakan kembali dan Anda tidak perlu mengulangi objek secara manual setiap kali dengan hanya melewatkan dua parameter untuk fungsi ini.
sumber
Metode ES6 :
sumber
Saya biasanya merekomendasikan lodash daripada garis bawah.
Jika Anda memilikinya, gunakan itu.
Jika tidak, maka Anda harus mempertimbangkan menggunakan paket lodash.invert npm, yang cukup kecil.
Inilah cara Anda mengujinya menggunakan tegukan:
1) Buat file bernama gulpfile.js dengan konten berikut:
2) Instal paket lodash.invert dan teguk
3) Uji itu berfungsi:
Referensi
https://www.npmjs.com/package/lodash.invert
https://lodash.com/
Perbedaan antara lodash dan garis bawah
https://github.com/gulpjs/gulp
sumber
Garis bawahi solusi js
sumber
ini bekerja untuk saya untuk mendapatkan kunci / nilai objek.
sumber
Sangat mudah.
sumber
Tetap sederhana!
Anda tidak perlu memfilter objek melalui metode atau lib canggih, Javascript memiliki fungsi bawaan bernama Object.values .
Contoh:
Ini akan mengembalikan data properti objek.
Referensi
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values
sumber