Saya memiliki objek JavaScript, apakah ada cara praktik terbaik bawaan atau yang diterima untuk mendapatkan panjang objek ini?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
javascript
javascript-objects
Gareth Simpson
sumber
sumber
Object.keys(obj).length
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
Object.keys()
kode di atas menjadi:Ini tidak harus memodifikasi prototipe yang ada karena
Object.keys()
sekarang sudah ada di dalamnya .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.
Object.keys
atauObject.getOwnPropertyNames
tidak berfungsi untuk properti simbolik. Untuk mengembalikannya, Anda harus menggunakanObject.getOwnPropertySymbols
.sumber
Object.keys(obj).length
Jika Anda tahu Anda tidak perlu khawatir tentang
hasOwnProperty
cek, Anda dapat melakukannya dengan sangat sederhana:sumber
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:
sumber
_.size()
adalah solusi sempurna untuk proyek Meteor saya , yang memiliki dukungan underscore.js.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.
sumber
Object.keys()
mengembalikan array yang hanya berisi nama-nama properti yang dapat dihitung. Jika Anda menginginkan array dengan SEMUA properti, Anda harus menggunakannyaObject.getOwnPropertyNames()
. Lihat developer.mozilla.org/en/docs/Web/JavaScript/Reference/…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".
sumber
Metode ini mendapatkan semua nama properti objek Anda dalam array, sehingga Anda bisa mendapatkan panjang array yang sama dengan panjang kunci objek Anda.
sumber
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. ;)
sumber
Inilah cara dan jangan lupa untuk memeriksa bahwa properti tersebut tidak ada dalam rantai prototipe:
sumber
Cukup gunakan ini untuk mendapatkan
length
:sumber
myArray
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 ...
sumber
length
properti, kode apa pun yang menggunakannya harus memastikan tidak mencoba dan menyimpan melawanlength
, tapi saya kira itu akan sama jika itu array standar juga. MengesampingkanhasOwnProperty
objek apa pun kemungkinan besar akan menghasilkan hasil yang tidak diinginkan.Ini bekerja untuk saya:
sumber
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.
sumber
Menggunakan:
sumber
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.
sumber
Jika Anda membutuhkan struktur data asosiatif yang memperlihatkan ukurannya, lebih baik gunakan peta daripada objek.
sumber
Bagaimana dengan sesuatu yang seperti ini --
sumber
Jika kita memiliki hash
kita bisa mendapatkan panjang menggunakan panjang kunci yang merupakan panjang dari hash:
sumber
sumber
var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
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:
sumber
Cara paling sederhana adalah seperti ini
di mana objek saya adalah objek dari apa yang Anda inginkan panjangnya
sumber
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:
Object.keys()
untuk mendapatkan array yang hanya berisi nama-nama properti yang dapat dihitung atauObject.getOwnPropertyNames()
jika Anda ingin juga menyertakan nama properti yang tidak dapat dihitung..length
properti dari array itu.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.
sumber
Gunakan
Object.keys(myObject).length
untuk mendapatkan panjang objek / arraysumber
sumber
Variasi pada beberapa hal di atas adalah:
Ini adalah cara yang sedikit lebih elegan untuk mengintegrasikan hasOwnProp.
sumber
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/
sumber
Object.prototype
- ide buruk.Anda cukup menggunakan
Object.keys(obj).length
pada objek apa saja untuk mendapatkan panjangnya. Object.keys mengembalikan array yang berisi semua kunci objek (properti) yang berguna untuk menemukan panjang objek yang menggunakan panjang array yang sesuai. Anda bahkan dapat menulis fungsi untuk ini. Mari berkreasi dan menulis metode untuk itu (bersama dengan properti pengambil yang lebih ramah):sumber
Anda selalu dapat melakukan
Object.getOwnPropertyNames(myObject).length
untuk mendapatkan hasil yang sama seperti yang[].length
akan diberikan untuk array normal.sumber
Object.keys()
mengembalikan array yang hanya berisi nama-nama properti yang dapat dihitung. Jika Anda menginginkan array dengan SEMUA properti, Anda harus menggunakannyaObject.getOwnPropertyNames()
. Lihat developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Kita dapat menemukan panjang Obyek dengan menggunakan:
sumber
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
1
.sumber
Di bawah ini adalah versi jawaban James Coglan di CoffeeScript untuk mereka yang telah meninggalkan JavaScript langsung :)
sumber
size++ for own key of obj
(own key
menjadi sintaksis dalam CoffeeScript). MenggunakanhasOwnProperty
langsung dari objek itu berbahaya, karena rusak ketika objek benar-benar memiliki properti seperti itu.