Soru Boş bir JavaScript nesnesini nasıl test ederim?


Bir AJAX isteğinden sonra, bazen benim uygulamam boş bir nesne gibi geri dönebilir:

var a = {};

Durumun bu olup olmadığını nasıl kontrol edebilirim?


1874
2018-03-25 01:39


Menşei


JSON.js komut dosyası kullanıyor musunuz? Ya da herhangi bir JSON kütüphanesi. Ardından, var dizeyi dönüştürmek ve daha sonra sınamak için JSON.encode () işlevini kullanabilirsiniz. - Thevs


Cevaplar:


ECMA 5+:

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

Ön ECMA 5:

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return JSON.stringify(obj) === JSON.stringify({});
}

jQuery:

jQuery.isEmptyObject({}); // true

lodash:

_.isEmpty({}); // true

Vurgulamak:

_.isEmpty({}); // true

Hoek

Hoek.deepEqual({}, {}); // true

ExtJS

Ext.Object.isEmpty({}); // true

AngularJS (sürüm 1)

angular.equals({}, {}); // true

Ramda

R.isEmpty({}); // true

3088
2018-03-25 01:49



İşte jQuery ve alt çizgi arasında performans testi jsperf.com/isempty-vs-isemptyobject/6 - Mikhail
Object.keys(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir. - cjbarth
Bir şeyleri tasnif etmek yerine, bu gerçeğin avantajlarından da yararlanabilirsiniz: (new Date()).constructor === Dateya da tersine, ({}).constructor === Object. - John Nelson
angular.equals ({}, {}); - Jeremy A. West
Object.keys() sayısız özelliği veya sembolü kontrol etmez. Kullanmalısın Object.getOwnPropertyNames() ve Object.getOwnPropertySymbols() yerine. Ayrıca, Object.getPrototypeOf() Bir nesnenin prototipini almanın doğru yolu. obj.constructor kolayca dövme yapılabilir. Örnek: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true. - Jesse


Bunu yapmanın kolay bir yolu yok. Açıkça özellikleri üzerinde döngü yapmak zorunda kalacaksınız:

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

Eğer ECMAScript 5 desteği kullanılabilir, kullanabilirsiniz Object.keys() yerine:

function isEmpty(obj) {
    return Object.keys(obj).length === 0;
}

747
2018-05-19 14:07



Bu iyi çalışıyor, ya da daha basit: function isEmpty (object) {for (nesnedeki var) {return true; } false döndür; } - Nicholas Kreidberg
Bu işlevde doğru ve yanlış tersine çevrilmemeli? - namtax
@namtax: hayır - işlev adlandırıldı isEmpty()bu yüzden dönmelidir false eğer bir mülkü varsa - Christoph
boş nesne varsayılan Nesne sınıfını genişletecektir, ancak nesne prototipi değiştirilirse basitleştirilmiş işleviniz dikkate alınmayacaktır: Object.prototype.a = 'hi'; var obj = {}; uyarı (obj.a); // outputs "hi" isEmpty (obj) // false değerini döndürür - venimus
İkinci örneği O (n) zaman karmaşıklığı ve O (n) uzay karmaşıklığından, ilk olarak O (1) olduğundan kullanmamalısınız. - Brian


Aynı sorunu olanlar ama jQuery kullananlarınız için kullanabilirsiniz. jQuery.isEmptyObject.


539
2018-03-22 20:35



HEY! Sadece birkaç saat IE 8 sorunları hata ayıklama sadece sorun neden oldu jQuery.isEmptyObject olduğunu bulmak için geçirdim. Nesne boşsa, doğru döner. - MFD3000
Eğer soru jQuery hakkında hiç değilse, jQuery dahil olmak üzere neden cevap yazıyorsunuz? - Eru
Onun eski bir yorum biliyorum, ama ben MFD3000 sorusu merak ediyorum, çünkü docu diyor: true ise, nesne boşsa (adından da anlaşılacağı gibi) - Александр Фишер
Böyle temel bir görev için jQuery dahil, doğru cevabı arayacağım şey değil. Günümüzde jQuery'nin hemen hemen her yerde olduğu doğrudur, ama yine de unutmamalıyız ki, çok yetenekli bir dilin etrafında inşa edilmiştir. - Pablo Mescher
Bu yorumlarda tipik JS snobbery. Herkes jQuery üzerinde yazılan web üzerindeki JavaScript'in büyük bir oranını bilir, bu yüzden jQuery için nesneleri test etmek için zaten yerleşik bir yöntemi varsa, burada bir çözüm sağlamak kesinlikle kabul edilebilir. Muhtemelen binlerce geliştiricinin yardım araması bu cevabı faydalı bulacaktır. Kimse bunu yapmanın tek yolu olmadığını söyledi. Kullanıma bir çözüm gönderen adam hakkında kimsenin tüm seçmenlere nasıl davrandığını fark etmiyorum underscore.js... - BadHorsie


Kullanabilirsiniz Underscore.js.

_.isEmpty({}); // true

184
2017-07-12 07:46



Ya da lodaş kullanabilirsiniz boş (lodash.com/docs#isEmpty), ama nasıl jQuery çözümü kullanmaktan farklı - hala ek bir kütüphane yüklemeniz gerekir. Ben bir vanilya javascript çözümü niyet olduğunu düşünüyorum. - tfmontague
JS'yi arka uçta Node.js. ile kullanmak istiyorsanız farklıdır. Birkaç kişi jQuery'yi (çoğunlukla DOM manipulasyonları için kullanılan bir ön uç kütüphanesi) arka uçta kullanmak isteyecektir. - Nahn
@tfmontague alt çizgi, istemci uygulamasında jQ'nun olduğu gibi neredeyse her yerde olduğu gibi, düğüm uygulamalarında çok yaygındır. Zaten gerekli alt alanı vardı ama bu işlevi olduğunu bilmiyordum - rw-nandemo
Alt çizgi lodash ile değiştiriliyor. Bunun yerine kullanın. - demisx
Sadece Tarih tiplerine dikkat edin, isEmpty her zaman Tarih için geçerli olur, bkz. github.com/jashkenas/underscore/issues/445 - mentat


Bu benim tercih ettiğim çözüm:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty

181
2017-11-06 13:48



IE9 BTW ile uyumluluk sorunu. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - doublejosh
Bu çözüm ie8 ile çalışır mı? - Jero Franzani
@Jero Franzani: hayır değil - nikoskip
Object.keys ({}) uzunluğu, (... in ...) seçeneğinden 10 kat daha yavaştır - bir objetc'in boş olup olmadığını sınamanın bir yolu olarak önleme öneririm. - davidhadas
Object.keys(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir. - cjbarth


if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

görmek http://bencollier.net/2011/04/javascript-is-an-object-empty/ 


103
2018-01-23 20:07



Bu IE8 ve altında çalışmıyor. - Stilltorik
İlgilendiğiniz takdirde bu, sayısız özelliği içerir.
Object.getOwnPropertyNames ({}) uzunluğu, (... in ...) seçeneğinden 10 kat daha yavaştır - bir objetc'in boş olup olmadığını sınamanın bir yolu olarak önleme öneririm. - davidhadas
Object.getOwnPropertyNames(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir. - cjbarth


JSON.stringify nasıl kullanılır? Tüm modern tarayıcılarda neredeyse mevcuttur.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

62
2018-01-31 10:55



dönüş (JSON.stringify (obj) == '{}') - Vic
Bu, bu tür bir program için yavaş ve hızlıdır. Burada hızlı ve mükemmel test: jsperf.com/empty-object-test - rur
Bu çok yavaş bir seçenek - bunun yerine (for ... in) seçeneğini kullanmanızı öneririm - davidhadas
Ve işlevleri içeren nesneler için işe yaramıyor. - Felix Kling


Eski soru, ama sadece sorunu vardı. Tek amacınız nesnenin boş olup olmadığını kontrol etmek ise JQuery dahil gerçekten iyi bir fikir değildir. Bunun yerine, sadece içine JQuery'nin koduve cevabı alacaksın:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}

51
2017-09-22 05:38



Bu, yalnızca başka bir işlemin temel nesnesine bir prototip eklemediğinde kullanışlıdır. Bunu gerçekten işe yaratabilmek için, obj.hasOwnProperty (ad) için sınamanız gerekir. - mpemburn


Ben de benzer bir duruma rastladım. JQuery kullanmak istemedim ve bunu saf Javascript kullanarak yapmak istedim.

Yaptığım şey şu koşulu kullandı ve benim için çalıştı.

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
   //Code here..
}

Eşit olmayan için şunu kullanın: JSON.stringify(obj) !== '{}'

Bunu kontrol et JSFiddle


42
2018-04-29 19:25



JSON.stringify olarak özel referanslar içeren nesneler için başarısız olur, çünkü onlar için özel bir istisna atar. - Pedro Montoto García
@ PedroMontotoGarcía Tamam ve boş bir nesne nasıl dairesel bir referansa sahip olacak? - KthProg
Nesne boş değilse (ve onlar için de çalışması gerekir). - Pedro Montoto García
Bu, @Ateszki tarafından daha önce belirtilmiş gibi görünüyor ve bir nesnenin boş olup olmadığını kontrol etmenin en yavaş yollarından biri. - cwadding
Ah evet .. onu özledim. Bu javascript'i gerçekleştirmek istediğim bir duruma rastladım ve biraz düşünmeden sonra bu şekilde anladım. @Ateszki, Yaptığın gibi olsa bile. :-) Btw, bunun üzerinde birçok cevap vardı ve cevabını kaçırdım. - Anish Nair


Daha yeni bir tarayıcıda olursanız basit bir yol var. Object.keys(obj).length == 0


21
2018-05-21 13:55



Nerede keys özellik geliyor?
Bu bir standart yöntem ECMAScript 5.1’de - download
Yukarıdaki yorum nasıl 4 upvotes olabilir? Evet, Object.keys standart bir yöntemdir ancak nesnelerin bir anahtar özelliği yoktur. Bu kod, herhangi bir nesneyi, yanlışlıkla bir özelliğe sahip olması dışında boş olarak rapor edecektir. key tekrar bir özellik olarak bir değerle length sıfır değil. Korkunç! - scravy
Object.keys(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir. - cjbarth
@scravy Object sınıf nesnesidir. Nesnenin argüman olarak bir nesneyi kabul eden 'anahtarlar' adlı statik bir yöntemi vardır. Bu yöntem, dizelerin özellik adları olduğu bir dizi dizge döndürür. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Sgnl


Nesnenin boş olup olmadığını belirlemek için tam bir işlev oluşturdum.

Kullanır Object.keys itibaren ECMAScript 5 En iyi performansı elde etmek için mümkünse (ES5) işlevsellik (bkz. uyumluluk tablosu) ve eski motorlar (tarayıcılar) için en uyumlu yaklaşıma geri dönüşler.

Çözüm

/**
 * Returns true if specified object has no properties,
 * false otherwise.
 *
 * @param {object} object
 * @returns {boolean}
 */
function isObjectEmpty(object)
{
    if ('object' !== typeof object) {
        throw new Error('Object must be specified.');
    }

    if (null === object) {
        return true;
    }

    if ('undefined' !== Object.keys) {
        // Using ECMAScript 5 feature.
        return (0 === Object.keys(object).length);
    } else {
        // Using legacy compatibility mode.
        for (var key in object) {
            if (object.hasOwnProperty(key)) {
                return false;
            }
        }
        return true;
    }
}

Burada öz bu kod için.

Ve işte JSFiddle gösteri ve basit bir test.

Umarım birisine yardım eder. Şerefe!


20
2018-03-25 11:48



Bu bir için başarısız null nesne.
Merhaba @torazaburo! Bir bildirim aldığınız için teşekkürler! Tüm kaynakları doğru uygulama ile güncelledik. - Slava Fomin II
Object.keys ({}) uzunluğu, (... in ...) seçeneğinden 10 kat daha yavaştır - bir objetc'in boş olup olmadığını sınamanın bir yolu olarak önleme öneririm. - davidhadas
Object.keys(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir. - cjbarth