我如何testing一个空的JavaScript对象?
在AJAX请求之后,有时我的应用程序可能会返回一个空对象,如:
var a = {};
我如何检查是否是这种情况?
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
ExtJS的
Ext.Object.isEmpty({}); // true
AngularJS(版本1)
angular.equals({}, {}); // true
Ramda
R.isEmpty({}); // 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; }
对于那些有相同问题但使用jQuery的人,可以使用jQuery.isEmptyObject 。
你可以使用Underscore.js 。
_.isEmpty({}); // true
这是我的首选解决scheme:
var obj = {}; return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
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
我创build了一个完整的函数来确定对象是否为空。
如果可能的话,它使用ECMAScript 5 (ES5)function中的Object.keys
,以实现最佳性能(请参阅兼容性表 ),并采用适用于旧版引擎(浏览器)的最兼容方法。
解
/** * 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的演示和一个简单的testing。
我希望这会帮助别人。 干杯!
如果你在一个新的浏览器上有一个简单的方法。 Object.keys(obj).length == 0
-
只是一个解决方法。 如果没有数据,你的服务器能否生成一些特殊的属性?
例如:
var a = {empty:true};
然后你可以很容易地在你的AJAXcallback代码中检查它。
-
另一种方法来检查它:
if (a.toSource() === "({})") // then 'a' is empty
编辑 :如果您使用任何JSON库(fe JSON.js),那么您可以尝试JSON.encode()函数并testing结果对空值string。
我正在使用这个。
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; }
使用Object.keys(obj).length(如上面ECMA 5+所build议的那样)对于空对象来说要慢10倍! 保持与旧学校(for … in)选项。
在Node,Chrom,Firefox和IE 9下testing,对于大多数使用情况来说,
- (for … in …)是最快的select!
- Object.keys(obj).length是空对象慢10倍
- JSON.stringify(obj).length总是最慢的 (不是令人惊讶的 )
- Object.getOwnPropertyNames(obj).length比Object.keys(obj)需要更长的时间。在某些系统上.length可能会更长。
底线performance明智,使用:
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; }
查看Is对象为空的详细testing结果和testing代码?
function isEmpty(obj) { for(var i in obj) { return false; } return true; }
jQuery在这种情况下有特殊的functionisEmptyObject()
:
jQuery.isEmptyObject({}) // true jQuery.isEmptyObject({ foo: "bar" }) // false
你可以使用这个简单的代码,不使用jQuery或其他库
var a=({}); //check is an empty object if(JSON.stringify(a)=='{}') { alert('it is empty'); } else { alert('it is not empty'); }
JSON类和它的函数( parsing和string化 )是非常有用的,但有一些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
如果jQuery和Web浏览器不可用,那么在underscore.js中也有一个isEmpty函数。
_.isEmpty({}) // returns true
此外,它不假定input参数是一个对象。 对于列表或string或未定义,它也将转向正确的答案。
我的拿:
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()
。
一个简单的循环:
var is_empty = true; for(var i in obj) { is_empty = false; break; }
我发现的最好的方法是:
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 (Object.keys(a).length > 0) { // not empty }
除了Thevs回答:
var o = {}; alert($.toJSON(o)=='{}'); // true var o = {a:1}; alert($.toJSON(o)=='{}'); // false
这是jquery + jquery.json
警告! 谨防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) 回报 {}
Sugar.JS为此提供了扩展对象。 代码干净简单:
制作扩展对象:
a = Object.extended({})
检查它的大小:
a.size()
以下示例显示如何testingJavaScript对象是否为空,如果为空,则表示没有自己的属性。
该脚本适用于ES6。
const isEmpty = (obj) => { if (obj === null || obj === undefined || Array.isArray(obj) || typeof obj !== 'object' ) { return true; } return Object.getOwnPropertyNames(obj).length === 0 ? true : false; }; 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
这一行代码有帮助
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中实现。 上面的行在旧版浏览器中有一个后备function。
JSFiddler
另一种select是使用is.js (14kB)而不是jquery (32kB), lodash (50kB)或下划线 (16.4kB)。 is.js被certificate是上述库中最快的库,可以用来确定一个对象是否为空。
http://jsperf.com/check-empty-object-using-libraries
显然,所有这些库都不完全相同,所以如果你需要轻松操纵DOM,那么jQuery可能仍然是一个不错的select,或者如果你需要更多的types检查,然后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
是一个更彻底的,因为它将返回枚举和不可枚举的属性,如这里所述。
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 === ''; } };
如果你不想引入一个库(这是可以理解的),并且你知道你只是检查对象(不是数组或string),那么下面的函数应该适合你的需求。
function isEmptyObject( obj ) { return Object.getOwnPropertyNames(obj).length === 0; }
这只是比is.js快一点,不过是因为你没有检查它是否是一个对象。
我不能相信,经过两年的编程js它从来没有点击过,空的对象和数组不是虚假的,最奇怪的是它从来没有抓到我。
这将返回true
如果input默认为falsey或者它是一个空的对象或数组。 相反是trueish
function
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
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; }
这将检查string,数组或对象(地图)的空白。
用法:
var a = {"a":"xxx","b":[1],"c":{"c_a":""}} isEmpty(a); // true, because acc_a is empty. isEmpty("I am a String"); //false