回答:
次のように、オブジェクトのプロパティをループできます。
for(var prop in ad) {
if (ad.hasOwnProperty(prop)) {
// handle prop as required
}
}
hasOwnProperty()メソッドを使用して、オブジェクトが指定されたプロパティをダイレクトプロパティとして持ち、オブジェクトのプロトタイプチェーンから継承されていないかどうかを判断することが重要です。
コメントから: あなたはそのコードを関数に入れ、コメントがある部分に到達するとすぐにfalseを返すようにすることができます
性能試験
Object.keys最も簡単でしょう:var a = [1,2,3];a.something=4;console.log(Object.keys(a))それはすでにあなたが安全にシムができECMA 5の一部だからです:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'})。
組み込みObject.keysメソッドを使用して、オブジェクトのキーのリストを取得し、その長さをテストできます。
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);、コンソールは各文字に対して0から7までの8つのキーを出力します。それとも私はまだ答えを理解していませんか?
簡単な関数を作るのはどうですか?
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
へのhasOwnProperty直接のメソッド呼び出しObject.prototypeは、安全性を少し追加するだけです。通常のobj.hasOwnProperty(...)呼び出しを使用して次のことを想像してください。
isEmptyObject({hasOwnProperty:'boom'}); // false
注:( 将来的に) 上記のメソッドはfor...inステートメントに依存し、このステートメントは列挙可能なプロパティに対してのみ反復します。現在最も広く実装されているECMAScript標準(第3版)では、プログラマは列挙できないプロパティを作成する方法がありません。
ただし、これはECMAScript 5th Editionで変更されており、列挙不可、書き込み不可、または削除不可のプロパティを作成できるため、上記のメソッドは失敗する可能性があります。例:
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!!
この問題のECMAScript 5ソリューションは次のとおりです。
function isEmptyObject(obj) {
return Object.getOwnPropertyNames(obj).length === 0;
}
このObject.getOwnPropertyNamesメソッドは、すべてArrayの名前を含む、列挙可能なかどうかにかかわらず、オブジェクトのプロパティの。このメソッドは現在、ブラウザベンダーによって実装されており、すでにChrome 5ベータ版と最新のWebKit Nightly Buildsにあります。
Object.defineProperty これらのブラウザと最新のFirefox 3.7 Alphaリリースでも利用できます。
hasOwnPropertyプロパティをオーバーライドすると、関数がクラッシュする可能性があります...私は少し偏執狂だと知っています...しかし、コードがどのような環境で使用されるかわからないことがありますが、あなたはどの方法を使いたいか知っています...
Object.prototypeがの列挙できないプロパティと一致する場合、によって列挙されないことに注意してくださいfor...in。だから、isEmptyObject({toString:1})失敗します。これは、汎用マッピングとしてまったく使用できないという残念な理由の1つですObject。
ではjQueryのあなたは使用することができます。
$.isEmptyObject(obj); // Returns: Boolean
jQuery 1.4以降、このメソッドはオブジェクト自体のプロパティと、プロトタイプから継承されたプロパティ(hasOwnPropertyを使用しない)の両方をチェックします。
ECMAScript第5版、現代のブラウザで(IE9 +、FF4 +、Chrome5 +、Opera12 +、Safari5 +)あなたはに建て使用することができますObject.keysの方法:
var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;
またはプレーンな古いJavaScript:
var isEmpty = function(obj) {
for(var p in obj){
return false;
}
return true;
};
最近のブラウザー(およびnode.js)は、オブジェクトリテラルのすべてのキーを含む配列を返すObject.keys()をサポートしているため、次のことができます。
var ad = {};
Object.keys(ad).length;//this will be 0 in this case
ブラウザサポート: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を使用している場合は、_。isEmpty関数を使用できます。
var obj = {};
var emptyObject = _.isEmpty(obj);
_.isEmpty([]) // true 最初に必ず確認してください:stackoverflow.com/a/22482737/1922747
_.some([1, 2]) // true 最初に必ず確認してください:stackoverflow.com/a/13356338/1922747
for (var hasProperties in ad) break;
if (hasProperties)
... // ad has properties
安全でオブジェクトプロトタイプをチェックする必要がある場合(これらは特定のライブラリによって追加され、デフォルトでは追加されません):
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]
}
メンバーとは、メンバーのプロパティ、メンバー変数など、呼び出したい名前を意味します> _>
上記のコードは、toStringを含むすべてを返します...オブジェクトのプロトタイプが拡張されているかどうかを確認するだけの場合:
var dummyObj = {};
for(var memberName in ad)
{
if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
//Member Name: memberName
//Member Value: ad[memberName]
}
注A:ダミーオブジェクトのメンバーが、テストオブジェクトのメンバーと同じ型であるかどうかを確認します。拡張の場合、dummyobjectのメンバータイプは「未定義」である必要があります
オブジェクトがユーザー定義のオブジェクトであることを確認したら、UDOが空かどうかを確認する最も簡単な方法は次のコードです。
isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};
この方法は(本質的に)演繹的な方法ですが、これは最速かつ最速の方法です。
a={};
isEmpty(a) >> true
a.b=1
isEmpty(a) >> false
PS:!ブラウザ定義のオブジェクトでは使用しないでください。
次のものを使用できます。
ダブルバン!! プロパティ検索
var a = !![]; // true
var a = !!null; // false
hasOwnProperty これは私が以前使用していたものです:
var myObject = {
name: 'John',
address: null
};
if (myObject.hasOwnProperty('address')) { // true
// do something if it exists.
}
ただし、JavaScriptはメソッド名を保護しないことを決定したため、改ざんされる可能性があります。
var myObject = {
hasOwnProperty: 'I will populate it myself!'
};
myObjectのprop
var myObject = {
name: 'John',
address: null,
developer: false
};
'developer' in myObject; // true, remember it's looking for exists, not value.
タイプの
if (typeof myObject.name !== 'undefined') {
// do something
}
ただし、nullはチェックされません。
これが一番いい方法だと思います。
オペレーター
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");
}
結果:
名前はmyObjectに存在します
次に、in演算子の詳細へのリンクを示します。オブジェクトプロパティが存在するかどうかの判断
ES6関数
/**
* 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
例:
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
これはどう?
var obj = {},
var isEmpty = !obj;
var hasContent = !!obj