Pertanyaan Panjang objek JavaScript


Jika saya memiliki objek JavaScript, katakan

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

apakah ada cara praktik terbaik yang ada di dalam atau diterima untuk mendapatkan panjang objek ini?


1820
2017-08-07 19:42


asal


Jawaban:


Jawaban paling kuat (yaitu menangkap maksud dari apa yang coba Anda lakukan sambil menyebabkan bug paling sedikit) adalah:

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myArray);

Ada semacam konvensi di JavaScript yang Anda jangan menambahkan hal ke Object.prototype, karena dapat memecahkan penghitungan di berbagai perpustakaan. Menambahkan metode ke Object biasanya aman.


Berikut pembaruan per 2016 dan penyebaran luas ES5 dan seterusnya.  Untuk IE9 + dan semua browser berkemampuan ES5 + modern lainnya, Anda dapat menggunakannya Object.keys() jadi kode di atas menjadi:

var size = Object.keys(myObj).length;

Ini tidak harus memodifikasi prototipe yang ada sejak Object.keys() sekarang sudah terpasang.

Edit: Objek dapat memiliki properti simbolis yang tidak dapat dikembalikan melalui metode Object.key. Jadi jawabannya tidak akan lengkap tanpa menyebutkannya.

Jenis simbol ditambahkan ke bahasa untuk membuat pengidentifikasi unik untuk properti objek. Manfaat utama dari jenis Simbol adalah pencegahan overwrite.

Object.keys atau Object.getOwnPropertyNames tidak berfungsi untuk properti simbolis. Untuk mengembalikannya, Anda harus menggunakannya Object.getOwnPropertySymbols.

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

2011
2017-08-09 08:31



Jika Anda tahu Anda tidak perlu khawatir hasOwnProperty cek, Anda dapat melakukan ini dengan sangat sederhana:

Object.keys(myArray).length

1407
2018-04-03 01:44



Diperbarui: Jika Anda menggunakan Underscore.js (disarankan, itu ringan!), maka Anda bisa melakukannya

_.size({one : 1, two : 2, three : 3});
=> 3

Jika tidak, dan Anda tidak ingin dipusingkan dengan properti Object karena alasan apa pun, dan sudah menggunakan jQuery, sebuah plugin sama-sama dapat diakses:

$.assocArraySize = function(obj) {
    // http://stackoverflow.com/a/6700/11236
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

252
2017-07-05 14:39



Gunakan sesuatu yang sederhana seperti:

Object.keys(obj).length

Tidak harus sulit dan pasti tidak memerlukan fungsi lain untuk diselesaikan.


153
2017-10-27 03:46



Inilah solusi lintas peramban yang paling banyak.

Ini lebih baik daripada jawaban yang diterima karena menggunakan Object.keys asli jika ada. Jadi, ini adalah yang tercepat untuk semua browser modern.

if (!Object.keys) {
    Object.keys = function (obj) {
        var arr = [],
            key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                arr.push(key);
            }
        }
        return arr;
    };
}

Object.keys(obj).length;

43
2017-09-01 16:12



Saya bukan ahli JavaScript, tetapi sepertinya Anda harus mengulang elemen dan menghitungnya karena Object tidak memiliki metode panjang:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey: Dalam kewajaran kepada OP, dokumentasi JavaScript sebenarnya secara eksplisit mengacu pada penggunaan variabel tipe Object dengan cara ini sebagai "associative arrays".


27
2017-08-07 19:52



Metode ini mendapatkan semua nama properti objek Anda dalam larik, sehingga Anda bisa mendapatkan panjang larik yang sama dengan panjang kunci objek Anda.

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

25
2017-07-01 12:40



Agar tidak berantakan dengan prototipe atau kode lainnya, Anda dapat membangun dan memperluas objek Anda sendiri:

function Hash(){
    var length=0;
    this.add = function(key, val){
         if(this[key] == undefined)
         {
           length++;
         }
         this[key]=val;
    }; 
    this.length = function(){
        return length;
    };
}

myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2

Jika Anda selalu menggunakan metode tambah, properti panjang akan menjadi benar. Jika Anda khawatir bahwa Anda atau orang lain lupa menggunakannya, Anda dapat menambahkan penghitung properti yang telah diposting oleh orang lain ke metode panjang juga.

Tentu saja, Anda selalu bisa menimpa metode. Tetapi bahkan jika Anda melakukannya, kode Anda mungkin akan gagal, membuatnya mudah untuk didebug. ;)


19
2018-06-11 15:44