Yanıtlar:
Nesnenizin özellikleri üzerinde aşağıdaki gibi döngü yapabilirsiniz:
for(var prop in ad) {
if (ad.hasOwnProperty(prop)) {
// handle prop as required
}
}
hasOwnProperty()Nesnenin doğrudan özellik olarak belirtilen özelliğe sahip olup olmadığını ve nesnenin prototip zincirinden miras alınmadığını belirlemek için yöntemi kullanmak önemlidir .
Yorumlardan: Bu kodu bir işleve koyabilir ve yorumun bulunduğu kısma ulaşır ulaşmaz yanlış döndürmesini sağlayabilirsiniz.
Performans testi
Herhangi bir özelliği test ederken Object.Keys vs For..In Testi
Object.keyskullanımı en kolay olacağını düşünüyorum : var a = [1,2,3];a.something=4;console.log(Object.keys(a))Zaten ECMA 5'in bir parçası olduğundan, güvenle şimşleyebilirsiniz: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'}).
Object.keysBir nesnedeki anahtarların listesini almak ve uzunluğunu test etmek için yerleşik yöntemi kullanabilirsiniz.
var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values
if(Object.keys(x).length > 0){
// Your code here if x has some properties
}
var str = "MyString"; Object.keys(str);, konsol her karakter için 0 ile 7 arasında 8 tuş çıkarır. Yoksa cevabı hala anlamıyorum.
Basit bir işlev yapmaya ne dersiniz?
function isEmptyObject(obj) {
for(var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return true;
}
isEmptyObject({}); // true
isEmptyObject({foo:'bar'}); // false
hasOwnPropertyDoğrudan yöntem çağrısı Object.prototypesadece biraz daha eklemektir emniyet normal kullanarak aşağıdaki hayal, obj.hasOwnProperty(...)çağrıyı:
isEmptyObject({hasOwnProperty:'boom'}); // false
Not: (gelecek için) Yukarıdaki yöntem for...inifadeye dayanır ve bu ifade yalnızca numaralandırılabilir özellikler üzerinde yinelenir , şu anda en yaygın olarak uygulanan ECMAScript Standardında (3. sürüm) programcının numaralandırılamayan özellikler oluşturmak için herhangi bir yolu yoktur .
Ancak bu şimdi değişti ECMAScript 5. Baskı ve numaralandırılamayan, yazılamayan veya silinebilen özellikler oluşturabiliyoruz, bu nedenle yukarıdaki yöntem başarısız olabilir , örneğin:
var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal',
enumerable: false,
writable: true,
configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!
Bu soruna bir ECMAScript 5 çözümü şöyle olacaktır:
function isEmptyObject(obj) {
return Object.getOwnPropertyNames(obj).length === 0;
}
Object.getOwnPropertyNamesYöntem döner bir Arrayadlarını içeren tüm The kendi özellikleri bulunan nesnenin enumerable veya olmasın , bu yöntem Chrome 5 Beta ve WebKit Gecelik Kurar son zaten var, tarayıcı satıcıları tarafından şimdi uygulanmaktadır.
Object.defineProperty bu tarayıcılarda ve en son Firefox 3.7 Alpha sürümlerinde de mevcuttur.
hasOwnPropertyözelliği geçersiz kılarsa, işlev çökebilir ... Biraz paranoyak olduğumu biliyorum ... ama bazen kodunuzun hangi ortamda kullanılacağını bilmiyorsunuz, ancak hangi yöntemi kullanmak istediğinizi biliyorsunuz ...
Object.prototype, numaralandırılamayan bir özellikle eşleşen bir ada sahip bir mülkünüz varsa , bunun tarafından numaralandırılmadığı IE'de bir hata olduğunu unutmayın for...in. Böylece isEmptyObject({toString:1})başarısız olur. Bu edemez talihsiz nedenlerinden biridir oldukça kullanmak Object, genel amaçlı haritalama olarak.
İle jQuery kullanabilirsiniz:
$.isEmptyObject(obj); // Returns: Boolean
JQuery 1.4 itibariyle, bu yöntem hem nesnenin kendisinin hem de prototiplerden miras alınan özellikleri (hasOwnProperty kullanmaması nedeniyle) denetler.
İle ECMAScript 5th Edition modern tarayıcılarda (IE9 +, FF4 +, Chrome5'te +, Opera12 +, Safari5 +) Eğer yerleşik kullanabilirsiniz Object.keys yöntemiyle:
var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;
Veya sade eski JavaScript:
var isEmpty = function(obj) {
for(var p in obj){
return false;
}
return true;
};
En son tarayıcılar (ve node.js), aşağıdakileri yapabilmeniz için nesne değişmezinizdeki tüm anahtarların bulunduğu bir dizi döndüren Object.keys () yöntemini destekler:
var ad = {};
Object.keys(ad).length;//this will be 0 in this case
Tarayıcı Desteği: Firefox 4, Chrome 5, Internet Explorer 9, Opera 12, Safari 5
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Underscore.js kullanıyorsanız _.isEmpty işlevini kullanabilirsiniz :
var obj = {};
var emptyObject = _.isEmpty(obj);
_.isEmpty([]) // true Önce kontrol ettiğinizden emin olun: stackoverflow.com/a/22482737/1922747
Lodash'ı kullanmak istiyorsanız, someyöntemi kullanabilirsiniz .
_.some(obj) // returns true or false
Bu küçük jsbin örneğine bakın
_.some([1, 2]) // true Önce kontrol ettiğinizden emin olun: stackoverflow.com/a/13356338/1922747
for (var hasProperties in ad) break;
if (hasProperties)
... // ad has properties
Güvende olmanız ve Nesne prototiplerini kontrol etmeniz gerekiyorsa (bunlar varsayılan olarak orada değil, belirli kütüphaneler tarafından eklenir):
var hasProperties = false;
for (var x in ad) {
if (ad.hasOwnProperty(x)) {
hasProperties = true;
break;
}
}
if (hasProperties)
... // ad has properties
for(var memberName in ad)
{
//Member Name: memberName
//Member Value: ad[memberName]
}
Üye, üye özelliği, üye değişkeni, her ne demek isterseniz
Yukarıdaki kod, toString de dahil olmak üzere HER ŞEY döndürecektir ... Yalnızca nesnenin prototipinin genişletilip genişletilmediğini görmek istiyorsanız:
var dummyObj = {};
for(var memberName in ad)
{
if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
//Member Name: memberName
//Member Value: ad[memberName]
}
Not A: Sahte nesnenin üyesinin test nesnesinin üyesiyle aynı tipte olup olmadığını kontrol ederiz. Uzatılmışsa, dummyobject öğesinin üye türü "tanımsız" olmalıdır
var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; }
// as of this line hasAnyProps will show Boolean whether or not any iterable props exist
Basit, her tarayıcıda çalışır ve olsa bile teknik olarak öyle nesne üzerinde tüm anahtarlar için bir döngü var DEĞİL hepsini aracılığıyla döngü ... ya orada 0 olduğunu ve döngü çalışmaz ya da bazı vardır ve ilk sonra kırar bir (çünkü kontrol ettiğimiz tek şey HİÇ ... ... neden devam edelim?)
Nesnenin kullanıcı tanımlı olduğundan emin olun, UDO'nun boş olup olmadığını belirlemenin en kolay yolu aşağıdaki kod olacaktır:
isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};
Bu yöntem (doğası gereği) tümdengelimsel olsa da - mümkün olan en hızlı ve en hızlı yöntemdir.
a={};
isEmpty(a) >> true
a.b=1
isEmpty(a) >> false
ps:! tarayıcı tanımlı nesnelerde kullanmayın.
Geç cevap, ancak bazı çerçeveler nesneleri numaralandırılabilir olarak ele alır. Bu nedenle, bob.js böyle yapabilir:
var objToTest = {};
var propertyCount = bob.collections.extend(objToTest).count();
Aşağıdakileri kullanabilirsiniz:
Çift kişilik patlama emlak arama
var a = !![]; // true
var a = !!null; // false
hasOwnProperty Bu kullandığım bir şey:
var myObject = {
name: 'John',
address: null
};
if (myObject.hasOwnProperty('address')) { // true
// do something if it exists.
}
Bununla birlikte, JavaScript yöntemin adını korumamaya karar verdi, bu yüzden kurcalanabilir.
var myObject = {
hasOwnProperty: 'I will populate it myself!'
};
myObject içinde pervane
var myObject = {
name: 'John',
address: null,
developer: false
};
'developer' in myObject; // true, remember it's looking for exists, not value.
bir çeşit
if (typeof myObject.name !== 'undefined') {
// do something
}
Ancak null olup olmadığını denetlemez.
Bence bu en iyi yol.
operatörde
var myObject = {
name: 'John',
address: null
};
if('name' in myObject) {
console.log("Name exists in myObject");
}else{
console.log("Name does not exist in myObject");
}
sonuç:
MyObject içinde ad var
Burada, in işleci hakkında daha ayrıntılı bilgi veren bir bağlantı bulunmaktadır: Bir nesne özelliğinin var olup olmadığını belirleme
ES6 işlevi
/**
* Returns true if an object is empty.
* @param {*} obj the object to test
* @return {boolean} returns true if object is empty, otherwise returns false
*/
const pureObjectIsEmpty = obj => obj && obj.constructor === Object && Object.keys(obj).length === 0
Örnekler:
let obj = "this is an object with String constructor"
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = {}
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = []
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = [{prop:"value"}]
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = {prop:"value"}
console.log(pureObjectIsEmpty(obj)) // empty? false
Buna ne dersin?
var obj = {},
var isEmpty = !obj;
var hasContent = !!obj