回答:
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object
ただし、これにより不要な配列(の戻り値keys
)が作成されることに注意してください。
ECMA 5以前:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop)) {
return false;
}
}
return JSON.stringify(obj) === JSON.stringify({});
}
jQuery.isEmptyObject({}); // true
_.isEmpty({}); // true
下線:
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
Object.keys(new Date()).length === 0
; したがって、この答えは誤解を招く可能性があります。
(new Date()).constructor === Date
、または逆に({}).constructor === Object
。
Object.keys()
列挙不可能なプロパティやシンボルはチェックしません。代わりにを使用する必要がObject.getOwnPropertyNames()
ありObject.getOwnPropertySymbols()
ます。また、Object.getPrototypeOf()
オブジェクトのプロトタイプを取得する正しい方法です。obj.constructor
簡単に偽造することができます。例:function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
。
これを行う簡単な方法はありません。プロパティを明示的にループする必要があります:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
場合はECMAScript 5のサポートが提供されています、あなたが使用することができますObject.keys()
代わりに:
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
isEmpty()
のでfalse
、プロパティがある場合に返されるはずです
同じ問題を抱えているがjQueryを使用している場合は、jQuery.isEmptyObjectを使用できます。
underscore.js
...
これは私の好ましい解決策です:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Object.keys(new Date()).length === 0
; したがって、この答えは誤解を招く可能性があります。
new Date()
オブジェクトではありません。nd = new Date(); nd.constructor === Object;
結果はfalse
です。
Underscore.jsを使用できます。
_.isEmpty({}); // true
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
http://bencollier.net/2011/04/javascript-is-an-object-empty/を参照してください
Object.getOwnPropertyNames(new Date()).length === 0
; したがって、この答えは誤解を招く可能性があります。
JSON.stringifyの使用はどうですか?ほとんどすべての最新ブラウザーで使用できます。
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
私はちょうど同じような状況に遭遇しました。私はJQueryを使用したくなかったし、純粋なJavascriptを使用してこれを実行したかった。
そして私がしたことは、次の条件を使用し、それは私のために働いた。
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
等しくない場合は、これを使用します。 JSON.stringify(obj) !== '{}'
古い質問ですが、問題がありました。オブジェクトが空でないかどうかを確認することが唯一の目的である場合、JQueryを含めることは実際には良い考えではありません。代わりに、JQueryのコードに深く入り込むだけで、答えが得られます。
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
新しいブラウザを使用している場合は、簡単な方法があります。
Object.keys(obj).length == 0
Object.keys
は標準的な方法ですが、オブジェクトにはkeysプロパティがありません。したがって、このコードは、偶然偶然に名前が付けられたプロパティにkey
値length
0のプロパティが付けられている場合を除いて、オブジェクトを空として報告します。恐ろしい!
Object.keys(new Date()).length === 0
; したがって、この答えは誤解を招く可能性があります。
今日2020.01.17私は選択したソリューションについて、Chrome v79.0、Safari v13.0.4、Firefox v72.0のMacOs HighSierra 10.13.6でテストを実行します。
結論
for-in
(A、J、L、M)に基づくソリューションが最速JSON.stringify
(B、K)に基づくソリューションは遅いObject
(N)に基づくソリューションも遅い以下のスニペットは、15のソリューションを示しています。あなたがあなたのマシン上でパフォーマンステストを実行したい場合はクリックHERE。
Object.keys(obj).lengthの使用(上記のECMA 5+で推奨)は、空のオブジェクトに対して10倍遅くなります!古い学校の(for ... in)オプションを使用します。
Node、Chrome、Firefox、IE 9でテスト済みで、ほとんどのユースケースで次のことが明らかになっています。
結論として、最終的なパフォーマンスは次のとおりです。
function isEmpty(obj) {
for (var x in obj) { return false; }
return true;
}
または
function isEmpty(obj) {
for (var x in obj) { if (obj.hasOwnProperty(x)) return false; }
return true;
}
詳細なテスト結果とテストコードについては、オブジェクトは空ですか?
Object.keys
遅いですが、コードは少なくなります。これが呼び出される小さなページで、おそらく10回...追加のコードの追加の解析時間を考慮すると、これはまだ遅くなりますか?
Objectキーの数を確認できます。
if (Object.keys(a).length > 0) {
// not empty
}
ただの回避策です。データがない場合、サーバーは特別なプロパティを生成できますか?
例えば:
var a = {empty:true};
その後、AJAXコールバックコードで簡単に確認できます。
それを確認する別の方法:
if (a.toSource() === "({})") // then 'a' is empty
編集:JSONライブラリ(fe JSON.js)を使用している場合は、JSON.encode()関数を試して、空の値の文字列に対して結果をテストできます。
toSource()
は非標準であり、IEやOpera(そして私がチェックしなかった他のブラウザでも動作する可能性があります)で動作しません
toSource
セクション15.2.4にプロパティをリストしていません。MDCによると、それはJS1.3(つまり、Netscape Navigator 4.06)で導入されましたが、ECMA-262、第3版ではありません!
toSource()
は恐ろしい方法です(現状のままJSON.encode()
)。オブジェクト全体が空かどうかを確認するために、オブジェクト全体を表す文字列を作成する必要があります。物事を文字列に変換するオーバーヘッドがありますが、オブジェクトに100万個のプロパティがある場合、100万個のものを変換する必要があります。
オブジェクトが空かどうかを判別する完全な関数を作成しました。
これは、使用していますObject.keys
から、ECMAScriptの5最高のパフォーマンス(参照達成することが可能であれば(ES5)機能適合表を古いエンジン(ブラウザ)のための最も互換性のあるアプローチ)とフォールバックを。
/**
* 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;
}
}
これがこのコードの要点です。
そして、デモと簡単なテストを行うJSFiddleを次に示します。
誰かのお役に立てば幸いです。乾杯!
Object.keys(new Date()).length === 0
; したがって、この答えは誤解を招く可能性があります。
これを使っています。
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;
}
例えば:
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;
更新
または
isEmptyObjectのjQuery実装を使用できます
function isEmptyObject(obj) {
var name;
for (name in obj) {
return false;
}
return true;
}
次の例は、JavaScriptオブジェクトが空かどうかをテストする方法を示しています。
スクリプトはES6で動作します。
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
Object.entries()の ES2017仕様に従って、最新のブラウザを使用したチェックは簡単です-
Object.entries({}).length === 0
Object.keys
かObject.values
?
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
Object
プロトタイプチェーンを介してメソッドで拡張された場合にも当てはまります。これは、列挙可能であり、for in
ステートメントが列挙可能なプロパティをループするためです。
jQueryにはisEmptyObject()
、この場合のための特別な機能があります。
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
少なくとも1つのキーがあるかどうかを確認します。空ではないと言えば十分でしょう。
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
false
値を返すとどうなりますか?結果false
は正しくありません。
内部では、すべてのライブラリのすべての空のチェックメソッドがオブジェクトキーチェックロジックを使用しています。それをわかりやすくするための奇妙な方法です。メソッドに入れることができます。ここで説明します。
for(key in obj){
//your work here.
break;
}
これはES5で進化しました。簡単に言うとObject.Keys
、オブジェクトをパラメーターとして受け取るメソッドを使用して、オブジェクトのキーの長さを確認できます。
if(Object.keys(obj).length > 0){
//do your work here
}
または、Lodashを使用している場合(使用する必要があります)。
_.isEmpty(obj) //==true or false
jQueryや他のライブラリを
使用しなかったこの単純なコードを使用できます
var a=({});
//check is an empty object
if(JSON.stringify(a)=='{}') {
alert('it is empty');
} else {
alert('it is not empty');
}
JSONクラスとその関数(解析と文字列化)は非常に便利ですが、IE7にはこの単純なコードhttp://www.json.org/js.htmlで修正できるといういくつかの問題があります。
その他の単純な方法(最も単純な方法):jQueryまたはJSONオブジェクト
を使用せずにこの方法を使用できます。
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
私が見つけた最良の方法:
function isEmpty(obj)
{
if (!obj)
{
return true;
}
if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
{
return true;
}
return false;
}
のために働く:
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
if (!obj && obj !== 0)
。
私の見解:
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
ただ、すべてのブラウザがObject.keys()
現在実装しているとは思いません。
Object.keys(new Date()).length === 0
; したがって、この答えは誤解を招く可能性があります。
jQueryとWebブラウザーが使用できない場合は、underscore.jsにもisEmpty関数があります。
_.isEmpty({}) // returns true
さらに、入力パラメーターがオブジェクトであるとは想定していません。リスト、文字列、または未定義の場合も、正解になります。
正解は次のとおりです。
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
これは以下をチェックします:
Object.prototype
です。つまり、オブジェクトはで作成されたオブジェクトと区別できません{}
。
Thevsの回答に加えて:
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
それはjquery + jquery.jsonです
$.isEmptyObject()
、自明ではない変換でサイクルを無駄にしないでください。