How do I test for an empty JavaScript object?
在Ajax请求之后,有时我的应用程序可能会返回一个空对象,例如:
1 | var a = {}; |
我该怎么检查情况呢?
ECMA 7+:
1 2 3 | // because Object.entries(new Date()).length === 0; // we have to do some additional check Object.entries(obj).length === 0 && obj.constructor === Object |
ECMA 5+:
1 2 3 | // because Object.keys(new Date()).length === 0; // we have to do some additional check Object.keys(obj).length === 0 && obj.constructor === Object |
预ECMA 5:
1 2 3 4 5 6 7 8 9 | function isEmpty(obj) { for(var prop in obj) { if(obj.hasOwnProperty(prop)) { return false; } } return JSON.stringify(obj) === JSON.stringify({}); } |
jQuery:
1 | jQuery.isEmptyObject({}); // true |
拉达什:
1 | _.isEmpty({}); // true |
强调:
1 | _.isEmpty({}); // true |
胡克
1 | Hoek.deepEqual({}, {}); // true |
EXTJS
1 | Ext.Object.isEmpty({}); // true |
AngularJS(版本1)
1 | angular.equals({}, {}); // true |
拉姆达
1 | R.isEmpty({}); // true |
这样做不容易。您必须显式地循环属性:
1 2 3 4 5 6 7 8 | function isEmpty(obj) { for(var prop in obj) { if(obj.hasOwnProperty(prop)) return false; } return true; } |
如果ecmascript 5支持可用,则可以使用
1 2 3 | function isEmpty(obj) { return Object.keys(obj).length === 0; } |
对于有相同问题但使用jquery的用户,可以使用jquery.isEmptyObject。
这是我的首选解决方案:
1 2 | var obj = {}; return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty |
您可以使用underline.js。
1 | _.isEmpty({}); // true |
1 2 3 | if(Object.getOwnPropertyNames(obj).length === 0){ //is empty } |
请参阅http://bencollier.net/2011/04/javascript-is-an-object-empty/
如何使用json.stringify?它几乎可以在所有现代浏览器中使用。
1 2 3 | function isEmptyObject(obj){ return JSON.stringify(obj) === '{}'; } |
老问题,但刚刚有了问题。如果您的唯一目的是检查对象是否为空,那么包含jquery并不是一个好主意。相反,只要深入了解jquery的代码,您就会得到答案:
1 2 3 4 5 6 7 8 9 | function isEmptyObject(obj) { var name; for (name in obj) { if (obj.hasOwnProperty(name)) { return false; } } return true; } |
我也遇到过类似的情况。我不想使用jquery,我想使用纯javascript来实现这一点。
我所做的是,使用以下条件,它对我有效。
1 2 3 4 | var obj = {}; if(JSON.stringify(obj) === '{}') { //This will check if the object is empty //Code here.. } |
对于不等于,请使用:
看看这个J小提琴
如果你在一个更新的浏览器上,有一个简单的方法。
我已经创建了一个完整的函数来确定对象是否为空。
如果可能的话,它使用ECMAScript 5(ES5)功能中的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /** * 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; } } |
这是这个代码的要点。
这里是JS处理演示和一个简单的测试。
我希望它能帮助别人。干杯!
您可以检查对象键的计数:
1 2 3 | if (Object.keys(a).length > 0) { // not empty } |
只是权宜之计。您的服务器能否在没有数据的情况下生成一些特殊属性?
例如:
1 | var a = {empty:true}; |
然后您可以在Ajax回调代码中轻松地检查它。
另一种检查方法:
1 | if (a.toSource() ==="({})") // then 'a' is empty |
编辑:如果使用任何JSON库(f.e.json.js),则可以尝试json.encode()函数,并根据空值字符串测试结果。
对于空对象,使用object.keys(obj).length(如上面对ecma 5+的建议)要慢10倍!保留旧学校的选择。
在node、chrom、firefox和ie 9下测试,很明显对于大多数用例:
- (对于…在…)是最快的选择使用!
- object.keys(obj).length对于空对象来说慢10倍
- json.stringify(obj).length总是最慢的(而不是最慢的)
- object.getownprotynames(obj).length比object.keys(obj)长。在某些系统上,length可以长很多。
底线性能,使用:
1 2 3 4 | function isEmpty(obj) { for (var x in obj) { return false; } return true; } |
或
1 2 3 4 | function isEmpty(obj) { for (var x in obj) { if (obj.hasOwnProperty(x)) return false; } return true; } |
请参阅详细的测试结果和测试代码,该代码位于对象是否为空?
我在用这个。
1 2 3 4 5 6 7 8 9 10 | 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; } |
如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | var myObject = {}; // Object is empty var isEmpty = isObjectEmpty(myObject); // will return true; // populating the object myObject = {"name":"John Smith","Address":"Kochi, Kerala <div class="suo-content">[collapse title=""]<ul><li>你好。当使用数字或布尔值true或false测试此函数时,返回true,这是不正确的结果。IsObjectEmpty(true)。IsObjectEmpty(假)。IsObjectEmpty(1)</li><li>我们正在检查对象是否为空,而不是数据类型是否为对象。在您的情况下,要检查它是否是一个对象,我们需要类似于if(typeof a=="object")…</li></ul>[/collapse]</div><hr><P>下面的示例演示如何测试javascript对象是否为空,如果为空,则表示它没有自己的属性。</P><P>该脚本在ES6上工作。</P><P>[cc lang="javascript"]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 |
jquery对于这种情况有特殊的功能
1 2 | jQuery.isEmptyObject({}) // true jQuery.isEmptyObject({ foo:"bar" }) // false |
请访问http://api.jquery.com/jquery.isEmptyObject了解更多信息/
1 2 3 4 | function isEmpty(obj) { for(var i in obj) { return false; } return true; } |
我发现最好的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function isEmpty(obj) { if (!obj) { return true; } if (!(typeof(obj) === 'number') && !Object.keys(obj).length) { return true; } return false; } |
作品:
1 2 3 4 5 6 7 8 9 10 | 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或其他库的简单代码
1 2 3 4 5 6 7 8 | var a=({}); //check is an empty object if(JSON.stringify(a)=='{}') { alert('it is empty'); } else { alert('it is not empty'); } |
JSON类和它的函数(parse和stringify)非常有用,但是IE7有一些问题,您可以用这个简单的代码http://www.json.org/js.html来修复它。
BR/>其他简单方式(最简单方式):
您可以这样使用而不使用jquery或json对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 |
我会去检查它是否至少有一把钥匙。这足以告诉我它不是空的。
1 | typeof obj !=="undefined" && Boolean(Object.keys(obj)[0]) |
我的拿手:
1 2 3 4 5 6 7 8 9 | 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 |
只是,我认为目前不是所有浏览器都实现
如果jquery和web浏览器不可用,那么在underline.js中还有一个isEmpty函数。
1 | _.isEmpty({}) // returns true |
此外,它不假定输入参数是对象。对于列表、字符串或未定义的,它还将转换正确的答案。
As per the ES2017 specification on Object.entries(), the check is
simple using any modern browser--
1 | Object.entries({}).length === 0 |
正确答案是:
1 2 3 4 | const isEmptyObject = obj => Object.getOwnPropertyNames(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0 && Object.getPrototypeOf(obj) === Object.prototype; |
这将检查:
- 对象没有自己的属性(不考虑可枚举性)。
- 对象没有自己的属性符号。
- 对象的原型正是
Object.prototype 。
换句话说,对象与使用
警告!注意JSON的限制。
1 2 3 4 5 6 7 8 9 10 11 12 13 | javascript: obj={ f:function(){} }; alert("Beware!! obj is NOT empty! obj = { f:function(){} }" + " JSON.stringify( obj ) returns " + JSON.stringify( obj ) ); |
显示器
1 2 3 4 5 6 7 8 9 | Beware!! obj is NOT empty! obj = { f:function(){} } JSON.stringify( obj ) returns {} |
Sugar.JS provides extended objects for this purpose. The code is clean and simple:
Make an extended object:
1 | a = Object.extended({}) |
检查尺寸:
1 | a.size() |
除了vs回答:
1 2 3 4 5 | var o = {}; alert($.toJSON(o)=='{}'); // true var o = {a:1}; alert($.toJSON(o)=='{}'); // false |
是jquery+jquery.json
Another alternative is to use is.js (14kB) as opposed to jquery (32kB), lodash (50kB), or underscore (16.4kB). is.js proved to be the fastest library among aforementioned libraries that could be used to determine whether an object is empty.
http://jsperf.com/check-empty-object-using-libraries
Obviously all these libraries are not exactly the same so if you need to easily manipulate the DOM then jquery might still be a good choice or if you need more than just type checking then lodash or underscore might be good. As for is.js, here is the syntax:
1 2 3 4 5 6 7 | var a = {}; is.empty(a); // true is.empty({"hello":"world <hr><P>在引擎盖下,所有库中的所有空检查方法都使用对象键检查逻辑。这是一个奇怪的方法,使它可以理解,你可以在这里描述一个方法。</P>[cc lang="javascript"]for(key in obj){ //your work here. break; } |
这是在ES5中发展而来的,现在简单地说,您可以使用
1 2 3 | if(Object.keys(obj).length > 0){ //do your work here } |
或者如果你使用的是罗达什(你必须这样)。
1 | _.isEmpty(obj) //==true or false |
这一行代码有助于
1 2 3 4 5 | 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.getownprotyname在ECMA-5中实现。上面这一行在具有回退功能的旧浏览器中工作。
杰斯菲德勒
1 2 3 4 5 6 | 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; } |
这将检查字符串、数组或对象(映射)的空性。
用途:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | var a = {"a":"xxx","b":[1],"c":{"c_a":" <hr><P>我不敢相信,经过两年的JS编程,它从来没有点击过空对象和数组不是假的,最奇怪的是它从来没有抓住我。</P><P>如果默认输入是错误的,或者输入是空对象或数组,则返回<wyn>true</wyn>。逆函数是<wyn>trueish</wyn>函数。</P><P>http://codepen.io/synthet1c/pen/pjmowl</P>[cc lang="javascript"]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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; } } |
用例和结果。
1 2 3 4 5 6 7 8 9 | 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 |
尝试破坏
1 2 3 4 | const a = {}; const { b } = a; const emptryOrNot = (b) ? 'not Empty' : 'empty'; console.log(emptryOrNot) |
这就是我想到的,用来判断对象中是否有任何非空值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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; } |
我为Ajax调用返回了一个空的JSON响应,而在ie8 jquery.isEmptyObject()中没有正确验证。我又加了一张支票,似乎能正确地抓住它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | .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开始,
1 2 3 | jQuery.isPlainObject({}) // true jQuery.isPlainObject("test" ) // false |
jQuery API
1 2 3 4 5 6 7 | export function isObjectEmpty(obj) { return ( Object.keys(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0 && obj.constructor === Object ); } |
这包括检查包含符号属性的对象。
object.keys不检索符号属性。
纯普通JavaScript,完全向后兼容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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({}) } } isObjectDefined() // false isObjectDefined('') // false isObjectDefined(1) // false isObjectDefined('string') // false isObjectDefined(NaN) // false isObjectDefined(null) // false isObjectDefined({}) // false isObjectDefined([]) // false isObjectDefined({a: ''}) // true |
You can define you own object prototype, just before its usage or at the beginning of your code.
The definition should look like this:
1 2 3 4 5 6 7 8 9 10 11 | Object.prototype.hasOwnProperties = function() { for (var k in this) { if ( this.hasOwnProperty(k) ) { return true; } } return false; } |
下面是一个用法示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var a = {}; while ( a.status !=="finished" ) { if ( status ==="processing" ) { a.status ="finished"; } if ( status ==="starting" ) { a.status ="processing"; } if ( !a.hasOwnProperties() ) { a.status ="starting"; } } |
享受!-)
奇怪的是,我在这里没有发现按价值进行比较(可能在这么多解决方案中遗漏了)。如果对象的所有值都未定义,我将介绍对象被视为空的情况:
1 2 3 4 | const isObjectEmpty = ( obj ) => Object.values( obj ).every( val => typeof val ==="undefined" ); isObjectEmpty({ foo: undefined, bar: undefined }): // true isObjectEmpty({ foo: false, bar: null }): // false |
因此,我们只能在提供子选项时扩展选项对象
1 2 3 4 5 6 | function onSubmit({ fullPage, width, height }) { const baseOptions = { fullPage }, clip = { width, height }, options = isObjectEmpty( clip ) ? baseOptions : { ...baseOptions, clip }; //... } |
向对象原型添加isEmpty()的版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // As a prototype: Object.prototype.isEmpty = function() { for(var i in this) return false; return true; } // As a function function objectIsEmpty(obj) { for (var i in obj) return false; return true; } var obj = {}; if (obj.isEmpty()) console.log('empty'); if (objectIsEmpty(obj)) console.log('empty'); |