Soru Bir JavaScript nesnesinin uzunluğu


Bir JavaScript nesnem varsa, söyle

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

Bu nesnenin uzunluğunu elde etmek için yerleşik veya kabul edilmiş en iyi uygulama yolu var mı?


1827
2017-08-07 19:42


Menşei


Javascript'teki nesne değişmezleri varsayılan olarak ilişkilendirici dizilerdir; örn. Object.propertyName.propertyValue, object [propertyName] [propertyValue] ile aynıdır. - neitony
Underscore.js'de bunu yapan bir tek liner eklendi: stackoverflow.com/a/11346637/11236 - ripper234
Bir kez cevap cevap @aeosynth olarak Object.keys (myArray) .length kullanın. - Ranadheer Reddy
tamam, ne dersin Object.keys(obj).length - Muhammad Umer
Object.length neden geçerli değil? Benim için doğru sonucu döndürür. - Adrian M


Cevaplar:


En sağlam yanıt (yani en az hataya neden olurken yapmaya çalıştığınız şeyin amacını yakalar):

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);

JavaScript'te bir tür sözleşme var. nesneleri Object.prototype dosyasına eklemeyinÇünkü çeşitli kütüphanelerde sayıları ayırabilir. Yine de Object'e metot eklemek genellikle güvenlidir.


İşte 2016 itibariyle bir güncelleme ve yaygın ES5 dağıtımı ve ötesinde.  IE9 + ve diğer tüm modern ES5 + yetenekli tarayıcılar için kullanabilirsiniz Object.keys() Yani yukarıdaki kod sadece olur:

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

Bu, mevcut herhangi bir prototipin değiştirilmesini gerektirmez Object.keys() şimdi yerleşik.

Düzenle: Nesneler Object.key yöntemi ile döndürülemeyen sembolik özelliklere sahip olabilir. Bu yüzden cevap, onlardan bahsetmeden eksik kalacaktır.

Nesne özellikleri için benzersiz tanımlayıcılar oluşturmak için dile sembol tipi eklendi. Sembol türünün ana faydası, üst yazıların önlenmesidir.

Object.keys veya Object.getOwnPropertyNames sembolik özellikler için çalışmaz. Onları iade etmek için kullanmanız gerekir 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

2022
2017-08-09 08:31



@Tres - Eğer kod zaten bir yerde zaten bildirildiğini bilmeden 'size' özelliği gelip overide eğer kodunuzu kırılabilir, bu yüzden zaten tanımlı olup olmadığını kontrol etmek her zaman değer - vsync
@vsync Çok doğru sizsiniz. Her zaman gerekli akıl kontrollerini uygulamalıdır :) - Tres
Neden herkes bunu görmezden geliyor: Object.keys(obj).length - Muhammad Umer
@MuhammadUmer Muhtemelen bu cevap yazıldığı zaman bu yöntem bile yoktu çünkü. Bugün bile, muhtemelen eski tarayıcılar için bir polfill gerektirir. - Chris Hayes
@stonyau IE8, IE9, IE10, Microsoft'tan destek almayan ölü tarayıcılardır. IE8, IE9, IE10 kullanıcısı Microsoft'tan bildirim alır, eski, desteklenmeyen bir tarayıcı kullanır ve bu şeylerin onlar için çalışmayacağını bekler. support.microsoft.com/en-us/kb/3123303 - Lukas


Eğer endişelenmene gerek olmadığını biliyorsan hasOwnProperty çekler, bunu çok basit yapabilirsiniz:

Object.keys(myArray).length

1413
2018-04-03 01:44



neden olmasın? Bildiğim kadarıyla bir standart: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/... - vsync
Bu evrensel olarak değil uygulanan yöntemi, ancak hangi tarayıcıyı desteklediğini kontrol edebilirsiniz bu masa. - aeosynth
IE8 desteği yok = hayır yok. - ripper234
firefox'a geçme zamanı = maalesef, geçiş yapmak web sitenizin kullanıcılarının ... - mdup
@ ripper234 no IE desteği = polyfill'e zaman - John Dvorak


Güncellenmiş: Kullanıyorsanız Underscore.js (tavsiye, bu hafif!), o zaman sadece yapabilirsin

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

Değilseve neden olursa olsun Object özellikleri ile uğraşmak istemezsiniz ve zaten jQuery kullanıyorsunuz, bir eklenti eşit olarak erişilebilir:

$.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



_.size() benim için mükemmel bir çözümdü Meteor altyazı.js desteği olan proje. - tokyovariable
Alt yazı kullanıyorum ve bu yazı bana bu projede yeterince kullanmadığımı hatırlattı. Nesneleri tutarsanız, underscore.js'yi kullanabilmeniz gerekir. - jbolanos
Ana Sayfa> (tümü - ['lo-dash']) - Rayjax
De var lodash.js  lodash - hipkiss
@Babydead, nesnenin gerçek özelliklerini miras kalanlardan ayırt etmek için. developer.mozilla.org/en/docs/Web/JavaScript/Reference/... - ripper234


Bir şeyi aşağıdaki gibi basit bir şekilde kullanın:

Object.keys(obj).length

Zor olmak zorunda değildir ve kesinlikle başarmak için başka bir işlev gerektirmez.


153
2017-10-27 03:46



Bu, aeosynth'in cevabından nasıl farklıdır? - DanMan
Bu soruya verilen cevapların sayısını gördünüz mü? Yazdığımda, (birkaç) kopyasını görmedim. James Coglan, aeosynth'den 3 yıl önce bu şekilde cevap verdi, bu yüzden tüm cevapları okumadınız ya da bunu görmüştünüz. - Michael
@Michael hayır, o yapmadı. 02-28-2016 tarihinde başka bir kullanıcı tarafından yapılan bir düzenleme oldu. gözden geçirmek - old_mountain


İşte en çapraz tarayıcı çözümü.

Varsa, yerel Object.keys kullandığı için bu kabul edilen yanıttan daha iyidir. Böylece, tüm modern tarayıcılar için en hızlıdır.

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



Object.keys() yalnızca numaralandırılabilen özelliklerin adlarını içeren bir dizi döndürür. TÜM özelliklere sahip bir dizi istiyorsanız, kullanmalısınız Object.getOwnPropertyNames() yerine. Görmek developer.mozilla.org/en/docs/Web/JavaScript/Reference/... - John Slegers


Ben bir JavaScript uzmanı değilim, ancak nesnenin bir uzunluk yöntemine sahip olmadığı için öğelerin arasında dolaşmanız ve bunları saymanız gerektiği gibi görünüyor:

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

@palmsey: OP'nin adaletli olması durumunda, JavaScript dokümantasyonu aslında bu şekilde Nesne tipi değişkenleri "ilişkisel diziler" olarak kullanmaktadır.


27
2017-08-07 19:52



Çalışmaz, çünkü prototip yoluyla eklenen yöntemler de sayılır. - Lajos Meszaros


Bu yöntem, tüm nesnenizin özellik adlarını bir diziye alır, böylece bu dizinin uzunluğunu nesnenin anahtarlarının uzunluğuna eşit olarak alabilirsiniz.

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

25
2017-07-01 12:40



Bu yöntemi tercih ediyorum çünkü dahili olarak "hasOwnProperty" diye çağırıyor, bu yüzden prototip zincirinden miras alınan özellik adlarını zorlamıyor ve tıpkı bir tek liner gibi Object.keys(...).length ama daha önce belirttiğim sebepten çok daha güvenli. - Patrick Roberts
@PatrickRoberts tuşları yöntemi, prototip zincirinden özellikleri döndürmez. Öyleyse neden hasOwnProperty'ye ihtiyaç duyuyorsunuz? Ayrıca getOwnProperty dizinin uzunluğu vb. Gibi gizli özellikleri döndürecektir. - Muhammad Umer
@MuhammadUmer "Eğer bir JavaScript ilişkilendirici dizilim varsa ..." bu bir nesne değil, bir dizidir. length Array örneğinin bir özelliğidir, bu nedenle anahtarların uzunluğunda hesaba katılmalıdır. Ve evet, prototip zinciri hakkında haklısınız, bu ifadeyi iptal ediyorum. Söylemek istediğim, genellikle Array benzeri olmayan bir nesneye sahipseniz, sayısız özelliği bile isteyebilirsiniz, çünkü bir Dizinin zaten bir length özellik ile başlamak. - Patrick Roberts
bu IE-8'de çalışır - marcusshep


Prototip veya başka bir kodla karıştırmamak için kendi nesnesini oluşturabilir ve genişletebilirsiniz:

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

Her zaman ekleme yöntemini kullanırsanız, uzunluk özelliği doğru olacaktır. Siz veya başkalarının bunu kullanmayı unuttuğundan endişe ediyorsanız, diğerlerinin uzunluk yöntemine gönderdiği özellik sayacını da ekleyebilirsiniz.

Tabii ki, her zaman yöntemlerin üzerine yazabilirsiniz. Ancak, siz bile olsa, kodunuz muhtemelen fark edilir bir şekilde başarısız olur ve hata ayıklamayı kolaylaştırır. ;)


19
2018-06-11 15:44



Dizinin büyük olması durumunda maliyetli olabileceği için 'for' ile döngü gerektirmediğinden bu en iyi çözümdür. - Digitlimit