Boş bir JavaScript nesnesini nasıl test edebilirim?


3109

Bir AJAX isteğinden sonra, bazen uygulamam aşağıdaki gibi boş bir nesne döndürebilir:

var a = {};

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


7
JSON.js komut dosyası kullanıyor musunuz? Veya başka bir JSON kütüphanesi. Daha sonra var değişkenini dizeye dönüştürmek ve test etmek için JSON.encode () işlevini kullanabilirsiniz.
Thevs

if( Object.entries(a).length > 0){ //do }
Muhammed Şahzad

Yanıtlar:


5423

ECMA 5+ :

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

Bununla birlikte, bunun gereksiz bir dizi (dönüş değeri keys) oluşturduğunu unutmayın.

ECMA Öncesi 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

Alt çizgi :

_.isEmpty({}); // true

Hoek

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

ExtJS

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

Açısal JS (sürüm 1)

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

Ramda

R.isEmpty({}); // true

22
İşte jQuery ve alt çizgi arasındaki performans testi jsperf.com/isempty-vs-isemptyobject/6
Mikhail

20
Object.keys(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir.
cjbarth

6
Bir şeyleri dizmek yerine, bu gerçekten de faydalanabilirsiniz: (new Date()).constructor === Dateya da tersine ({}).constructor === Object.
John Nelson

2
açısal.equals ({}, {});
Jeremy A. West

11
Object.keys()numaralandırılamayan özellikleri veya simgeleri kontrol etmez. Sen kullanmak gerekir Object.getOwnPropertyNames()ve Object.getOwnPropertySymbols()bunun yerine. Ayrıca, Object.getPrototypeOf()bir nesnenin prototipini almanın doğru yoludur. obj.constructorkolayca dövülebilir. Örnek: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true.
Jesse

862

Bunu yapmanın kolay bir yolu yok. Özellikler üzerinde açıkça döngü yapmanız gerekecek:

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

    return true;
}

Eğer ECMAScript 5 desteği mevcuttur kullanabilirsiniz Object.keys()yerine:

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

56
Bu iyi veya daha basit çalışır: function isEmpty (object) {for (nesnede var i) {return true; } yanlış döndür; }
Nicholas Kreidberg

36
Bu işlevde doğru ve yanlış ters çevrilmemeli midir?
namtax

25
@namtax: hayır - fonksiyonun adı isEmpty(), bu nedenle falsebir özelliği varsa geri dönmelidir
Christoph

6
boş nesne varsayılan Object sınıfını genişletir, ancak nesne prototipi değiştirilirse basitleştirilmiş işleviniz başarısız olur: Object.prototype.a = 'hi'; var obj = {}; uyarısı (obj.a); // çıktılar "hi" isEmpty (obj) // yanlış döndürür
venimus

29
O (n) zaman karmaşıklığı ve O (n) uzay karmaşıklığı olduğu için ikinci örneği kullanmamalısınız, birincisi O (1).
Brian

572

Aynı sorunu yaşayan ancak jQuery kullananlarınız için jQuery.isEmptyObject kullanabilirsiniz .


43
HEY! Sadece IE 8 sorunları hata ayıklama sadece bu soruna neden jQuery.isEmptyObject olduğunu bulmak için birkaç saat geçirdim. Nesne boşsa true değerini döndürür.
MFD3000

162
Soru jQuery ile ilgili değilse neden jQuery dahil cevap gönderiyorsunuz?
Eru

47
Eski bir yorum biliyorum, ama sorunuzu merak ediyorum @ MFD3000, çünkü docu diyor ki: nesne boşsa (isminden de anlaşılacağı gibi) true değerini döndürür
Александр Фишер

21
Böyle temel bir görev için jQuery dahil doğru cevap dediğim şey değil. Günümüzde jQuery'nin neredeyse her yerde olduğu doğrudur, ancak yine de çok yetenekli bir dilin etrafında inşa edildiğini unutmamalıyız.
Pablo Mescher

54
Bu yorumlarda tipik JS züppeliği. Herkes web üzerindeki JavaScript'in büyük bir kısmının jQuery üzerine yazıldığını bilir, bu nedenle zaten nesneleri test etmek için yerleşik bir yöntemi varsa jQuery için bir çözüm sağlamak mükemmel kabul edilebilir. Yardım arayan binlerce geliştiricinin bu yanıtı yararlı bulması muhtemeldir. Kimse bunu yapmanın tek yolu olduğunu söylemedi. Kimse kullanmak için bir çözüm gönderen adam hakkında tüm elitist nasıl hareket fark underscore.js...
BadHorsie

276

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


3
@Jero Franzani: hayır değil
nikoskip

Object.keys ({}). Uzunluğu (for ... in ...) seçeneğinden 10 kat daha yavaş - bir objetc'in boş olup olmadığını test etmenin bir yolu olarak kullanılmasını öneriyorum.
davidhadas

10
Object.keys(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir.
cjbarth

new Date()bir nesne değildir. nd = new Date(); nd.constructor === Object;ile sonuçlanır false.
pors

204

Underscore.js'yi kullanabilirsiniz .

_.isEmpty({}); // true

19
Ya da lodash boş kullanabilirsiniz ( lodash.com/docs#isEmpty ), ancak bu bir jQuery çözümü kullanmaktan nasıl farklıdır - yine de ek bir kitaplık yüklemeniz gerekir. Bence bir vanilya javascript çözümü niyettir.
tfmontague

10
Node.js ile arka uçta JS kullanmak istiyorsanız farklıdır. Çok az kişi arka uçta jQuery'yi (çoğunlukla DOM manipülasyonları için kullanılan bir ön uç kütüphanesi) kullanmak isteyecektir.
Nahn

3
@tfmontague alt çizgisi, düğüm uygulamalarında çok yaygındır, neredeyse jQ istemci tarafında olduğu kadar yaygındır. Zaten alt çizgi gerekli vardı ama bu işlevi olduğunu fark etmedi
rw-nandemo

5
Alt çizgi yerine lodash kullanılıyor. Bunun yerine bunu kullanın.
demisx

2
Tarih türlerine dikkat edin, isEmpty her zaman Date için true olarak döner, bkz. Github.com/jashkenas/underscore/issues/445
mentat

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

bkz. http://bencollier.net/2011/04/javascript-is-an-object-empty/


5
Bu, önemsemeniz durumunda numaralandırılamayan özellikleri içerir.

Object.getOwnPropertyNames ({}). Uzunluğu (for ... in ...) seçeneğinden 10 kat daha yavaş - bir objetc'in boş olup olmadığını test etmenin bir yolu olarak kullanılmasını öneriyorum.
davidhadas

4
Object.getOwnPropertyNames(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir.
cjbarth

80

JSON.stringify kullanmaya ne dersiniz? Neredeyse tüm modern tarayıcılarda kullanılabilir.

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

23
return (JSON.stringify (obj) == '{}')
Vic

26
Bu yavaştır ve bu tür bir yardımcı program için hız önemlidir. Hızlı mükemmel test burada: jsperf.com/empty-object-test

1
Bu çok yavaş bir seçenek - bunun yerine (için ... in) seçeneğini kullanmanızı öneririm
davidhadas

2
Ve işlev içeren nesneler için çalışmaz.
Felix Kling

1
Ayrıca, nesnede dairesel bir başvuru varsa bir hata atar. Bu yüzden yavaş, güvenilmez ve hatalar atabilir ve her şeyi kırabilir. Bunu kullanmak için hiçbir sebep yok.
Burak

62

Ben de benzer bir durumla karşılaştım. JQuery kullanmak istemiyordu ve saf Javascript kullanarak bunu yapmak istedim.

Ve yaptığım şey, aşağıdaki koşulu kullanmaktı ve benim için çalıştı.

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

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

Bu JSFiddle'a göz atın


4
JSON.stringify özellikle onlar için bir istisna atar gibi dairesel başvuruları olan nesneler için başarısız olur.
Pedro Montoto García

1
@ PedroMontotoGarcía Tamam ve boş bir nesnenin dairesel bir referansı nasıl olacak?
KthProg

8
Nesne boş değilse (ve onlar için de çalışmalıdır).
Pedro Montoto García

Bu, @Ateszki tarafından zaten belirtilmiş gibi görünüyor ve bir nesnenin boş olup olmadığını kontrol etmenin en yavaş yollarından biridir.
cwadding

Ah evet .. Özledim. Bu javascript'i elde etmek istediğim bir durumla karşılaştım ve biraz düşündükten sonra bu şekilde anladım. @Ateszki, Senin tarzında bile olsa. :-) Btw, bu konuda çok cevap vardı ve bu yüzden cevabınızı kaçırdım.
Anish Nair

60

Eski soru, ama sadece sorunu vardı. Tek amacınız nesnenin boş olup olmadığını kontrol etmekse, JQuery'yi eklemek gerçekten iyi bir fikir değildir. Bunun yerine, JQuery'nin kodunun derinliklerinde ve yanıtı alacaksınız:

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

5
Bu, yalnızca başka bir işlem temel nesnenize bir prototip eklemediyse yararlıdır. Bunu gerçekten uygulanabilir hale getirmek için obj.hasOwnProperty (name)
mpemburn'u

1
Bu, Christoph'un 2009'daki cevabına hiçbir şey
katmıyor

39

Daha yeni bir tarayıcı kullanıyorsanız basit bir yol vardır. Object.keys(obj).length == 0


1
Nerede gelmez keysmülkiyet geliyor?

2
Bu bir var standart yöntem 5.1 ECMAScript'te
indir

1
Yukarıdaki yorumda nasıl 4 oy vardır? Evet, Object.keysstandart bir yöntemdir, ancak nesnelerin keys özelliği yoktur. Dolayısıyla bu kod, yanlışlıkla sıfır olmayan keybir özellik olarak adlandırılan bir değere sahip bir özelliğe sahip olması dışında herhangi bir nesneyi boş olarak bildirir length. Korkunç!
scravy

Object.keys(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir.
cjbarth

11
@scravy Object, Object sınıfıdır. Nesnenin, nesneyi bağımsız değişken olarak kabul eden 'anahtarlar' adlı statik bir yöntemi vardır. Bu yöntem, dizelerin özellik adları olduğu bir dizeler dizisi döndürür. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
Sgnl

34

Verim

Bugün 2020.01.17 Seçilen çözümler için Chrome v79.0, Safari v13.0.4 ve Firefox v72.0 üzerinde MacOs HighSierra 10.13.6 üzerinde testler yapıyorum.

Sonuçlar

  • for-in(A, J, L, M) tabanlı çözümler en hızlısıdır
  • JSON.stringify(B, K) tabanlı çözümler yavaştır
  • şaşırtıcı bir şekilde Object(N) 'ye dayalı çözüm yavaştır

resim açıklamasını buraya girin

ayrıntılar

Snippet'te aşağıda 15 çözüm sunulmaktadır. Makinenizde performans testi yapmak istiyorsanız BURAYA tıklayın .

resim açıklamasını buraya girin


bunların çoğu mantıklı değil çünkü her şeyi yanlış ve / veya doğru bir dönüşe dayandırıyorsunuz. Bazen programlama bir if ifadesine veya üçlü bir operatöre ihtiyaç duyar. sadece fyi
Christian Matthew

1
En iyi cevap bu, teşekkürler, ilk çözüm bir cazibe gibi çalışıyor
Carlos Jesus Arancibia Taborga

33

Object.keys (obj) .length (yukarıda ECMA 5+ için önerildiği gibi) kullanımı boş nesneler için 10 kat daha yavaştır! eski okul (... için) seçeneği ile devam edin.

Düğüm, Chrome, Firefox ve IE 9 altında test edildiğinde, çoğu kullanım durumunda aşağıdakiler ortaya çıkmaktadır:

  • (için ... içinde ...) kullanımı en hızlı seçenektir!
  • Object.keys (obj). Boşluğu, boş nesneler için 10 kat daha yavaş
  • JSON.stringify (obj). Uzunluk her zaman en yavaş (şaşırtıcı değil)
  • Object.getOwnPropertyNames (obj) .length , bazı sistemlerde Object.keys (obj) .length'den daha uzun sürebilir.

Alt satırda performans akıllıca, kullanın:

function isEmpty(obj) { 
   for (var x in obj) { return false; }
   return true;
}

veya

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

Nesne boş mu? Bölümünde ayrıntılı test sonuçlarını ve test kodunu görün.


Object.keysyavaş, ancak daha az kod. Buna denilen küçük bir sayfada ... belki 10 kez ... Ek kodun ek ayrıştırma süresi düşünüldüğünde bu daha yavaş olur mu?
yankee


27
  1. Sadece bir çözüm. Sunucunuz veri olmaması durumunda özel bir özellik oluşturabilir mi?

    Örneğin:

    var a = {empty:true};

    Ardından AJAX geri arama kodunuzda kolayca kontrol edebilirsiniz.

  2. Kontrol etmenin başka bir yolu:

    if (a.toSource() === "({})")  // then 'a' is empty

DÜZENLEME : Herhangi bir JSON kitaplığı (fe JSON.js) kullanıyorsanız, JSON.encode () işlevini deneyebilir ve sonucu boş değer dizesine karşı test edebilirsiniz.


6
toSource()standart değildir ve IE veya Opera'da (ve muhtemelen kontrol etmediğim diğer tarayıcılarda) çalışmaz
Christoph

4
@Thevs: belki de ECMA-262'nin mevcut sürümünün farklı bir kopyası var, ancak benimki toSourcebölüm 15.2.4'te bir özellik listelemiyor; MDC'ye göre, JS1.3'te (yani Netscape Navigator 4.06) tanıtıldı, ancak ECMA-262, 3. baskıda DEĞİL!
Christoph

4
@Thevs: en az 2 önemli tarayıcı satıcısı bunu uygulamadı, bu yüzden fiili bir standart değil ve ECMA-262'de olmadığı için de gerçek değil ...
Christoph

4
Çalıştığında bile, bunu toSource()yapmanın korkunç bir yoludur (olduğu gibi JSON.encode()). Boş olup olmadığını kontrol etmek için tüm nesnenizi temsil eden bir dize oluşturmanız gerekir. İşleri dizelere dönüştürmenin ek yükü var, ancak nesneniz bir milyon özelliğe sahipse bir milyon şeyi dönüştürmek gerekecek, aslında sadece birine bakmak boş olmadığını bildirecektir.
Jasper

4
Havai büyüktür @Thevs o bile olabilir büyüklükte aynı sırada (Ben her koşulda olduğundan emin değilim). Bununla birlikte, bu cevap, hikayenin hep birlikte farklı olmasını sağlayan farklı bir mülk bulunur bulunmaz yanlış döndürmeyi içerir ...
Jasper

25

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

Bu kullanır Object.keysdan ECMAScript 5 en iyi performansı (bkz elde etmek mümkünse (ES5) işlevselliği uyumluluk tablosu eski motorlara (tarayıcılar) için en uyumlu yaklaşıma) ve yedeklerini.

Çö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;
    }
}

İşte Gist bu kodu.

Ve burada gösteri ve basit bir test ile JSFiddle .

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


3
Bu bir nullnesne için başarısız olur .

Merhaba @torazaburo! Dikkat ettiğiniz için teşekkürler! Tüm kaynakları doğru uygulama ile güncelledim.
Slava Fomin II

1
Object.keys ({}). Uzunluğu (for ... in ...) seçeneğinden 10 kat daha yavaş - bir objetc'in boş olup olmadığını test etmenin bir yolu olarak kullanılmasını öneriyorum.
davidhadas

1
Object.keys(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir.
cjbarth

19

Bunu kullanıyorum.

function isObjectEmpty(object) {
  var isEmpty = true;
  for (keys in object) {
     isEmpty = false;
     break; // exiting since we found that the object is not empty
  }
  return isEmpty;
}

Örneğin:

var myObject = {}; // Object is empty
var isEmpty  = isObjectEmpty(myObject); // will return true;

// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"}; 

// check if the object is empty
isEmpty  = isObjectEmpty(myObject); // will return false;

buradan

Güncelleme

VEYA

isEmptyObject'in jQuery uygulamasını kullanabilirsiniz

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

Selam. Bu işlevi sayı veya boolean true veya false ile test ettiğinizde true değerini döndürür ve bu doğru sonuç değildir. isObjectEmpty (doğru). isObjectEmpty (yanlış). isObjectEmpty (1)
iman

2
Veri türünün bir nesne olup olmadığını değil, nesnenin boş olup olmadığını kontrol ediyoruz. Senin durumunda bir nesne olup olmadığını kontrol etmek için eğer biz gibi bir şey gerekir (typeof a === "nesne") {...}
kiranvj

15

Aşağıdaki örnek, bir JavaScript nesnesinin boş olup olmadığını nasıl test edeceğinizi gösterir;

Komut dosyası ES6 üzerinde çalışır.

const isEmpty = (obj) => {
    if (obj === null ||
        obj === undefined ||
        Array.isArray(obj) ||
        typeof obj !== 'object'
    ) {
        return true;
    }
    return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty(''));           // true
console.log(isEmpty(33));           // true
console.log(isEmpty([]));           // true
console.log(isEmpty({}));           // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello'));      // true
console.log(isEmpty([1, 2, 3]));    // true
console.log(isEmpty({ test: 1 }));  // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date()));   // true
console.log(isEmpty(Infinity));     // true
console.log(isEmpty(null));         // true
console.log(isEmpty(undefined));    // true


15

Gereğince ES2017 üzerine şartnamede Object.entries () , çek herhangi bir modern browser-- kullanarak basittir

Object.entries({}).length === 0

3
En baştan kullanmanın bir yararı var mı Object.keysyoksa Object.values?
faintsignal

@faintsignal bunları kullanarak mükemmel para cezası. Sadece yorumlarda bulamadım girişleri ekledim.
Vikrant

13
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}

4
Bu, örneğin bir JavaScript kitaplığı Objectprototip zinciri aracılığıyla bir yöntemle genişletildiğinde de doğru olacaktır, çünkü bu numaralandırılabilir ve for inifade numaralandırılabilir özellikler arasında dolaşır.
viam0Zah

12

jQuery isEmptyObject()bu durum için özel bir işleve sahiptir :

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

Daha fazla bilgi için http://api.jquery.com/jQuery.isEmptyObject/


12

En az bir anahtar olup olmadığını kontrol etmek için gider. Bana bunun boş olmadığını söylemek yeterli.

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])

1
ilk anahtar falsedeğer döndürürse ne olur ? sonuç falseyanlış olur.
Jimmy Obonyo Abor

Bunu test ettim. Çalışan bir örnek verebilir misiniz?
Tudor Morar

1
Bu kısa ve özlüdür, ancak Nesne tanımsızsa çalışma zamanı hatasına neden olur
Mrinmoy

11

Kaputun altında, tüm kütüphanelerdeki tüm boş kontrol yöntemleri, nesne anahtarları kontrol mantığını kullanır. Anlaşılabilir hale getirmenin garip bir yolu, burada bir yöntemle koyabilirsiniz, burada açıklanmıştır .

for(key in obj){
   //your work here.
 break;
}

ES5'te evrimleşen , şimdi basitçe, nesnenizi Object.Keysparametre olarak alan yöntemi kullanarak nesnenin anahtar uzunluğunu kontrol edebilirsiniz :

if(Object.keys(obj).length > 0){
 //do your work here
}

Ya da Lodash kullanıyorsanız (olmalısınız).

 _.isEmpty(obj) //==true or false

If ifadesi yapmanın garip bir yolu olarak doğru olsa da - muhtemelen sizden sonra kodu koruyacak birini karıştırır.
Soren

10


jQuery veya diğer kütüphaneleri kullanmayan bu basit kodu kullanabilirsiniz

var a=({});

//check is an empty object
if(JSON.stringify(a)=='{}') {
    alert('it is empty');
} else {
    alert('it is not empty');
}

JSON sınıfı ve işlevleri ( ayrıştırma ve stringify ) çok yararlıdır, ancak IE7 ile bu basit kodla düzeltebileceğiniz bazı problemleri vardır http://www.json.org/js.html .

Diğer Basit Yol (en basit Yol): jQuery veya JSON nesnesi
kullanmadan bu yolu kullanabilirsiniz .

var a=({});

function isEmptyObject(obj) {
    if(typeof obj!='object') {
        //it is not object, so is not empty
        return false;
    } else {
        var x,i=0;
        for(x in obj) {
            i++;
        }
        if(i>0) {
            //this object has some properties or methods
            return false;
        } else {
            //this object has not any property or method
            return true;
        }
    }
}

alert(isEmptyObject(a));    //true is alerted

JSON.stringifyNesne, işlevler veya "tanımsız" gibi dizgisi olmayan özellikler içeriyorsa, bu bir kenar durumu olduğu kabul edilirse çözüm başarısız olur.

10

Bulduğum en iyi yol:

function isEmpty(obj)
{
    if (!obj)
    {
        return true;
    }

    if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
    {
        return true;
    }

    return false;
}

Şunun için çalışır:

    t1: {} -> true
    t2: {0:1} -: false
    t3: [] -> true
    t4: [2] -> false
    t5: null -> true
    t6: undefined -> true
    t7: "" -> true
    t8: "a" -> false
    t9: 0 -> true
    t10: 1 -> false

3
0'ın aslında bir sayı olduğu için boş olmadığını söyleyebilirim. her şey iyi görünüyor ama düzeltme kolaydır. ilk if deyiminde bunu ekleyin. if (!obj && obj !== 0).
mjwrazor

9

Benim almam:

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

var a = {a:1, b:2}
var b = {}

console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true

Sadece, Object.keys()şu anda tüm tarayıcıların uygulandığını düşünmüyorum .


2
Object.keys(new Date()).length === 0; bu yüzden bu cevap yanıltıcı olabilir.
cjbarth

3
Hiçbir zaman anahtarları açığa çıkarmaya rağmen bir tarihin her zaman "dolu" olduğunu düşünüyorsanız. Ancak, planınız buysa, Tarih yapıcısı için ek bir örnek ekleyerek iyi bir seçenek olduğunu kabul ediyorum.
NiKo

9

JQuery ve web tarayıcısı mevcut değilse, underscore.js'de bir isEmpty işlevi de vardır.

_.isEmpty({}) // returns true

Ayrıca, giriş parametresinin bir nesne olduğunu varsaymaz. Bir liste veya dize veya tanımsız için doğru yanıtı da döndürür.



7

Uyarı! JSON'un sınırlamalarına dikkat edin.

javascript:
  obj={  f:function(){}  };
  alert( "Beware!! obj is NOT empty!\n\nobj = {  f:function(){}  }" + 
               "\n\nJSON.stringify( obj )\n\nreturns\n\n" +
                        JSON.stringify( obj ) );

görüntüler

    Dikkat!! obj boş DEĞİL!

    obj = {f: fonksiyon () {}}

    JSON.stringify (obj)

    İadeler

    {}

7

Doğru cevap:

const isEmptyObject = obj =>
  Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype;

Bu şunları kontrol eder:

  • Nesnenin kendi özellikleri yoktur (numaralandırılabilirlik ne olursa olsun).
  • Nesnenin kendi özellik sembolleri yoktur.
  • Nesnenin prototipi aynen öyle Object.prototype.

Başka bir deyişle, nesne ile yaratılandan ayırt edilemez {}.


6

Thevs cevabına ek olarak:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

jquery + jquery.json


JSON kullanmayı sevmiyorum çünkü dairesel nesne yapılarıyla çalışamıyor.
itdoesntwork

2
Sayfanızda jQuery yüklüyse kullanın $.isEmptyObject(), açık olmayan dönüşümlerle döngüleri boşa harcamayın.
skierpage

6

Sugar.JS bu amaç için genişletilmiş nesneler sağlar. Kod temiz ve basittir:

Genişletilmiş bir nesne oluşturun:

a = Object.extended({})

Boyutunu kontrol edin:

a.size()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.