Saya memiliki objek JavaScript, apakah ada cara praktik terbaik bawaan atau yang diterima untuk mendapatkan panjang objek ini?
Jawaban: Jawaban yang paling kuat (yaitu yang menangkap maksud dari apa yang Anda coba lakukan sambil menyebabkan bug paling sedikit) adalah:
Ada semacam konvensi dalam JavaScript yang Anda tidak menambahkan hal-hal ke Object.prototype , karena itu dapat merusak enumerasi di berbagai perpustakaan. Menambahkan metode ke Objek biasanya aman. Berikut
ini adalah pembaruan pada 2016 dan penyebaran luas ES5 dan seterusnya. Untuk IE9 + dan semua browser yang mampu ES5 + modern lainnya, Anda dapat menggunakan
Ini tidak harus memodifikasi prototipe yang ada karena Sunting : Objek dapat memiliki sifat simbolis yang tidak dapat dikembalikan melalui metode Object.key. Jadi jawabannya tidak lengkap tanpa menyebutkannya. Jenis simbol ditambahkan ke bahasa untuk membuat pengidentifikasi unik untuk properti objek. Manfaat utama dari tipe Symbol adalah pencegahan overwrites.
Jika Anda tahu Anda tidak perlu khawatir tentang
Diperbarui : Jika Anda menggunakan Underscore.js (disarankan, ini ringan!), Maka Anda bisa melakukannya
Jika tidak , dan Anda tidak ingin dipusingkan dengan properti Object untuk alasan apa pun, dan sudah menggunakan jQuery, sebuah plugin dapat diakses dengan sama:
Inilah solusi lintas-peramban yang paling banyak. Ini lebih baik daripada jawaban yang diterima karena menggunakan Object.keys asli jika ada. Dengan demikian, ini adalah yang tercepat untuk semua browser modern.
Saya bukan pakar JavaScript, tetapi sepertinya Anda harus mengulang-ulang elemen dan menghitungnya karena Object tidak memiliki metode panjang:
@palmsey: Sejujurnya pada OP, dokumentasi JavaScript sebenarnya secara eksplisit merujuk pada penggunaan variabel tipe Objek dengan cara ini sebagai "array asosiatif". Metode ini mendapatkan semua nama properti objek Anda dalam array, sehingga Anda bisa mendapatkan panjang array yang sama dengan panjang kunci objek Anda.
Untuk tidak mengacaukan prototipe atau kode lain, Anda dapat membuat dan memperluas objek Anda sendiri:
Jika Anda selalu menggunakan metode add, properti panjang akan benar. Jika Anda khawatir bahwa Anda atau orang lain lupa menggunakannya, Anda bisa menambahkan penghitung properti yang juga diposkan orang lain ke metode panjang. Tentu saja, Anda selalu bisa menimpa metode. Tetapi bahkan jika Anda melakukannya, kode Anda mungkin akan gagal terlihat, membuatnya mudah untuk di-debug. ;) Inilah cara dan jangan lupa untuk memeriksa bahwa properti tersebut tidak ada dalam rantai prototipe:
Cukup gunakan ini untuk mendapatkan
Berikut adalah solusi yang sama sekali berbeda yang hanya akan berfungsi di browser yang lebih modern (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+) Lihat jsFiddle Atur kelas Array Asosiatif Anda
Sekarang Anda dapat menggunakan kode ini sebagai berikut ...
Ini bekerja untuk saya:
Untuk beberapa kasus, lebih baik menyimpan ukuran dalam variabel terpisah. Terutama, jika Anda menambahkan ke array dengan satu elemen di satu tempat dan dapat dengan mudah menambah ukuran. Jelas akan bekerja lebih cepat jika Anda perlu memeriksa ukurannya sesering mungkin. Menggunakan:
Dan dalam keadilan untuk @palmsey dia cukup benar, mereka bukan array asosiatif, mereka pasti objek :) - melakukan pekerjaan array asosiatif. Tetapi mengenai poin yang lebih luas, Anda tampaknya memiliki hak untuk itu menurut artikel yang agak bagus yang saya temukan: JavaScript “Array Asosiatif” Dianggap Berbahaya Tetapi menurut semua ini, bukankah jawaban yang diterima itu sendiri merupakan praktik yang buruk?
Jika ada yang lain telah ditambahkan ke Object .prototype, maka kode yang disarankan akan gagal:
Saya tidak berpikir bahwa jawaban harus yang diterima karena tidak dapat dipercaya untuk bekerja jika Anda memiliki kode lain yang berjalan dalam konteks eksekusi yang sama. Untuk melakukannya dengan cara yang kuat tentunya Anda perlu menentukan metode ukuran dalam myArray dan memeriksa jenis anggota saat Anda mengulanginya. Jika Anda membutuhkan struktur data asosiatif yang memperlihatkan ukurannya, lebih baik gunakan peta daripada objek.
Bagaimana dengan sesuatu yang seperti ini --
Jika kita memiliki hash
kita bisa mendapatkan panjang menggunakan panjang kunci yang merupakan panjang dari hash:
Jika Anda menggunakan AngularJS 1.x Anda dapat melakukan berbagai hal dengan cara AngularJS dengan membuat filter dan menggunakan kode dari salah satu contoh lain seperti berikut:
Pemakaian Di controller Anda:
Atau menurut Anda:
Cara paling sederhana adalah seperti ini
di mana objek saya adalah objek dari apa yang Anda inginkan panjangnya Jika Anda tidak peduli tentang mendukung Internet Explorer 8 atau lebih rendah, Anda dapat dengan mudah mendapatkan jumlah properti di objek dengan menerapkan dua langkah berikut:
Jika Anda perlu melakukan ini lebih dari sekali, Anda bisa membungkus logika ini dalam suatu fungsi:
Cara menggunakan fungsi khusus ini:
Lihat juga Fiddle ini untuk demo. Gunakan
Variasi pada beberapa hal di atas adalah:
Ini adalah cara yang sedikit lebih elegan untuk mengintegrasikan hasOwnProp. Inilah versi berbeda dari jawaban James Cogan. Alih-alih menyampaikan argumen, cukup prototipe kelas Object dan buat kode lebih bersih.
contoh jsfiddle: http://jsfiddle.net/qar4j/1/ Anda cukup menggunakan
Anda selalu dapat melakukan Kita dapat menemukan panjang Obyek dengan menggunakan:
Agak terlambat untuk permainan, tetapi cara yang bagus untuk mencapai ini (hanya IE9 +) adalah dengan mendefinisikan pengambil sihir pada properti panjang:
Dan Anda bisa menggunakannya seperti ini:
Akan memberi Di bawah ini adalah versi jawaban James Coglan di CoffeeScript untuk mereka yang telah meninggalkan JavaScript langsung :)
|