AJAXリクエストの後、私のアプリケーションは空のオブジェクトを返すことがあります。
var a = {};
そうであるかどうかをどうやって確認できますか?
ECMA 7+ :
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.entries(obj).length === 0 && obj.constructor === Object
ECMA 5+ :
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object
プレ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
アンダースコア :
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
これを行う簡単な方法はありません。明示的にプロパティをループする必要があります。
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
ECMAScript 5 support が利用可能な場合は、代わりにObject.keys()
を使用できます。
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
同じ問題を抱えているがjQueryを使っている人のために、 jQuery.isEmptyObject を使うことができます。
これが私の推奨する解決策です。
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Underscore.js を使用できます。
_.isEmpty({}); // true
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
http://bencollier.net/2011/04/javascript-is-an-object-empty/ /を参照
JSON.stringifyはどうですか?最近のすべてのブラウザでほぼ利用可能です。
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
昔の質問ですが、問題がありました。オブジェクトが空でないかどうかを確認することだけが目的である場合は、JQueryを含めることはあまりお勧めできません。代わりに、 JQueryのコード に深く入るだけで、答えが得られます。
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
私はちょうど似たような状況に遭遇しました。私はJQueryを使いたくなかったし、純粋なJavascriptを使ってこれをしたかった。
そして、私がしたことは、次の条件を使用して、そしてそれは私のために働きました。
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
等しくない場合は、これを使用します。JSON.stringify(obj) !== '{}'
これをチェックしてください JSFiddle
新しいブラウザを使っているなら簡単な方法があります。 Object.keys(obj).length == 0
オブジェクトが空かどうかを判断するための完全な関数を作成しました。
可能な場合は Object.keys
from 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キーの数を確認できます。
if (Object.keys(a).length > 0) {
// not empty
}
ただの回避策です。データがない場合、サーバーは特別なプロパティを生成できますか?
例えば:
var a = {empty:true};
そうすれば、AJAXコールバックコードで簡単に確認できます。
それをチェックするもう一つの方法:
if (a.toSource() === "({})") // then 'a' is empty
_ edit _ :任意のJSONライブラリ(たとえば、JSON.js)を使用する場合は、JSON.encode()関数を試して、空の値の文字列に対して結果をテストします。
Object.keys(obj).lengthを使用すると(上のECMA 5+で推奨されているように)、空のオブジェクトの場合は10倍遅くなります。オールドスクール(for ... in)オプションを守ってください。
Node、Chrom、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;
}
詳細なテスト結果とテストコードは オブジェクトは空ですか? で参照してください。
私はこれを使っています。
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;
更新
OR
あなたは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
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
この場合、jQueryには特別な関数isEmptyObject()
があります。
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
私が見つけた最良の方法:
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
jQueryや他のライブラリを使用していないこの単純なコードを使用できます。
var a=({});
//check is an empty object
if(JSON.stringify(a)=='{}') {
alert('it is empty');
} else {
alert('it is not empty');
}
_ json _ classおよびその関数( parse および stringify )は非常に便利ですが、IE7に関するいくつかの問題を解決できますこの簡単なコードで http://www.json.org/js.html 。
その他の単純な方法(最も単純な方法):
jQuery または _ json _ objectを使用せずにこの方法を使用できます。
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) {
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()
を実装しているとは思いません。
私はそれが少なくとも一つのキーを持っているかどうかを調べに行きます。それは空ではないと私に言うのに十分だろう。
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
JQueryとWebブラウザが利用できない場合は、underscore.jsにisEmpty関数もあります。
_.isEmpty({}) // returns true
また、入力パラメータをオブジェクトとは見なしません。リスト、文字列、または未定義の場合、正しい答えにもなります。
ES2017 Object.entries()の指定に従って、このチェックは現代のブラウザを使用しても簡単です。
Object.entries({}).length === 0
正しい答えは:
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
これにより、次のことが確認されます。
Object.prototype
です。つまり、オブジェクトは{}
で作成されたものと区別がつきません。
警告! JSONの制限に注意してください。
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 ) );
ディスプレイ
注意してください。 objは空ではありません! obj = {f:function(){}} JSON.stringify(obj) 。]は {} を返します。
Thevsの答えに加えて:
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
それはjquery + jquery.jsonです
Sugar.JS はこの目的のために拡張オブジェクトを提供します。コードはきれいでシンプルです:
拡張オブジェクトを作る:
a = Object.extended({})
サイズを確認してください。
a.size()
もう1つの方法は、 jquery (32kB)、 lodash (50kB)、または アンダースコア ではなく、 is.js (14kB)を使用することです。 (16.4kB) is.jsは、オブジェクトが空かどうかを判断するために使用できる前述のライブラリの中で最も速いライブラリであることが証明されました。
http://jsperf.com/check-empty-object-using-libraries
DOMを簡単に操作する必要がある場合は jquery が依然として適切な選択であるか、単に型チェック以上のものが必要な場合は lodash または アンダースコア が良いかもしれません。 is.js の場合、構文は次のとおりです。
var a = {};
is.empty(a); // true
is.empty({"hello": "world"}) // false
アンダースコアやlodashの_.isObject()
のように、これはobjects
だけのものではありませんがarrays
とstrings
にも当てはまります。
内部的には、このライブラリはObject.getOwnPropertyNames
に似たObject.keys
を使用していますが、Object.getOwnPropertyNames
は、 here のように列挙可能で列挙不可能なプロパティを返すので、より徹底的です。
is.empty = function(value) {
if(is.object(value)){
var num = Object.getOwnPropertyNames(value).length;
if(num === 0 || (num === 1 && is.array(value)) || (num === 2 && is.arguments(value))){
return true;
}
return false;
} else {
return value === '';
}
};
ライブラリを持ち込みたくない場合(理解できることです)、オブジェクト(配列や文字列ではない)のみをチェックしていることがわかっている場合は、次の関数がニーズに合っているはずです。
function isEmptyObject( obj ) {
return Object.getOwnPropertyNames(obj).length === 0;
}
それがオブジェクトかどうかをチェックしていないからといって、これはis.jsより少し速いだけです。
内部では、すべてのライブラリのすべての空のチェックメソッドがオブジェクトキーチェックロジックを使用しています。それを理解しやすくするための奇妙な方法です。あなたはそれをメソッドに入れることができます。Described here 。
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
2年間のプログラミングのあと、空のオブジェクトや配列が間違っていないとクリックすることは決してありませんでした。
入力がデフォルトでfalseの場合、または空のオブジェクトまたは配列の場合、これはtrue
を返します。逆はtrueish
関数です
http://codepen.io/synthet1c/pen/pjmoWL
function falsish( obj ){
if( (typeof obj === 'number' && obj > 0) || obj === true ){
return false;
}
return !!obj
? !Object.keys( obj ).length
: true;
}
function trueish( obj ){
return !falsish( obj );
}
falsish({}) //=> true
falsish({foo:'bar'}) //=> false
falsish([]) //=> true
falsish(['foo']) //=> false
falsish(false) //=> true
falsish(true) //=> false
// the rest are on codepen
この1行のコードは役に立ちます
var a = {}; //if empty returns false
(Object.getOwnPropertyNames != undefined ? Object.getOwnPropertyNames(a).length != 0 : (function(){for(var key in a) break; return (key != null) && (key != undefined);})()) //Returns False
var a = {b:2} //if not empty returns true
(Object.getOwnPropertyNames != undefined ? Object.getOwnPropertyNames(a).length != 0 : (function(){for(var key in a) break; return (key != null) && (key != undefined);})()) //Returns true
Object.getOwnPropertyNames はECMA-5で実装されています。上記の行は、フォールバック機能付きの古いブラウザでも動作します。
isEmpty = function(obj) {
if (obj == null) return true;
if (obj.constructor.name == "Array" || obj.constructor.name == "String") return obj.length === 0;
for (var key in obj) if (isEmpty(obj[key])) return true;
return false;
}
これは文字列、配列、またはオブジェクト(マップ)の空虚さをチェックします。
使用法 :
var a = {"a":"xxx","b":[1],"c":{"c_a":""}}
isEmpty(a); // true, because a.c.c_a is empty.
isEmpty("I am a String"); //false
export function isObjectEmpty(obj) {
return (
Object.keys(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
obj.constructor === Object
);
}
これには、 シンボルプロパティを含むオブジェクトのチェックが含まれます。
Object.keys はシンボルプロパティを取得しません。
一方、 null、未定義、 ''、 ''、{}、[] などのすべての「空」をチェックする関数を1つ持つことができます。
var isEmpty = function(data) {
if(typeof(data) === 'object'){
if(JSON.stringify(data) === '{}' || JSON.stringify(data) === '[]'){
return true;
}else if(!data){
return true;
}
return false;
}else if(typeof(data) === 'string'){
if(!data.trim()){
return true;
}
return false;
}else if(typeof(data) === 'undefined'){
return true;
}else{
return false;
}
}
ユースケースと結果.
console.log(isEmpty()); // true
console.log(isEmpty(null)); // true
console.log(isEmpty('')); // true
console.log(isEmpty(' ')); // true
console.log(isEmpty(undefined)); // true
console.log(isEmpty({})); // true
console.log(isEmpty([])); // true
console.log(isEmpty(0)); // false
console.log(isEmpty('Hey')); // false
試してみる 破壊する
const a = {};
const { b } = a;
const emptryOrNot = (b) ? 'not Empty' : 'empty';
console.log(emptryOrNot)
ここでは値による比較を見つけることができないのは奇妙なことです(たぶん多くの解決法の中で見逃してしまうでしょう)。
const isObjectEmpty = ( obj ) => Object.values( obj ).every( val => typeof val === "undefined" );
isObjectEmpty({ foo: undefined, bar: undefined }): // true
isObjectEmpty({ foo: false, bar: null }): // false
したがって、サブオプションが提供されている場合にのみ、オプションオブジェクトを拡張できます。
function onSubmit({ fullPage, width, height }) {
const baseOptions = { fullPage },
clip = { width, height },
options = isObjectEmpty( clip ) ? baseOptions : { ...baseOptions, clip };
//...
}
純粋なVanilla Javascript、および完全な下位互換性
function isObjectDefined (Obj) {
if (Obj === null || typeof Obj !== 'object' ||
Object.prototype.toString.call(Obj) === '[object Array]') {
return false
} else {
for (var prop in Obj) {
if (Obj.hasOwnProperty(prop)) {
return true
}
}
return JSON.stringify(Obj) !== JSON.stringify({})
}
}
console.log(isObjectDefined()) // false
console.log(isObjectDefined('')) // false
console.log(isObjectDefined(1)) // false
console.log(isObjectDefined('string')) // false
console.log(isObjectDefined(NaN)) // false
console.log(isObjectDefined(null)) // false
console.log(isObjectDefined({})) // false
console.log(isObjectDefined([])) // false
console.log(isObjectDefined({a: ''})) // true
_ only _ {}
を実際に受け入れるには、Lodashを使用してJavascriptでこれを実行する最善の方法は次のとおりです。
_.isEmpty(value) && _.isPlainObject(value)
使用する直前、またはコードの最初に、独自のオブジェクトプロトタイプを定義できます。
定義は次のようになります。
Object.prototype.hasOwnProperties = function()
{
for (var k in this)
{
if ( this.hasOwnProperty(k) )
{
return true;
}
}
return false;
}
使用例は次のとおりです。
var a = {};
while ( a.status !== "finished" )
{
if ( status === "processing" )
{
a.status = "finished";
}
if ( status === "starting" )
{
a.status = "processing";
}
if ( !a.hasOwnProperties() )
{
a.status = "starting";
}
}
楽しい! :-)
AJAX呼び出しに対して空のJSON応答を返していましたが、IE 8ではjQuery.isEmptyObject()が正しく検証されませんでした。私はそれをきちんと捕まえているように思われる追加のチェックを追加しました。
.done(function(data)
{
// Parse json response object
var response = jQuery.parseJSON(data);
// In IE 8 isEmptyObject doesn't catch the empty response, so adding additional undefined check
if(jQuery.isEmptyObject(response) || response.length === 0)
{
//empty
}
else
{
//not empty
}
});
JQuery 1.4では、isEmptyObject()
メソッドはオブジェクト自身のプロパティとプロトタイプから継承されたプロパティの両方をチェックします(hasOwnPropertyを使用しないという点で)。他の種類のオブジェクト(DOM要素、プリミティブな文字列/数値、Hostオブジェクト)では、ブラウザ間で一貫した結果が得られない可能性があるため、引数は常にプレーンなJavaScriptオブジェクトにしてください。オブジェクトが単純なJavaScriptオブジェクトかどうかを判断するには、$.isPlainObject()
を使用します。
jQuery.isPlainObject({}) // true
jQuery.isPlainObject( "test" ) // false
オブジェクトにnull以外の値があるかどうかを確認するために、これが思いつきました。
function isEmpty(obj: Object): Boolean {
for (const prop in obj) {
if (obj.hasOwnProperty(prop)) {
if (obj[prop] instanceof Object) {
const rtn = this.isEmpty(obj[prop]);
if (rtn === false) {
return false;
}
} else if (obj[prop] || obj[prop] === false) {
return false;
}
}
}
return true;
}