Sau một yêu cầu AJAX, đôi khi ứng dụng của tôi có thể trả về một đối tượng trống, như:
var a = {};
Làm thế nào tôi có thể kiểm tra xem đó là trường hợp?
if( Object.entries(a).length > 0){ //do }
Sau một yêu cầu AJAX, đôi khi ứng dụng của tôi có thể trả về một đối tượng trống, như:
var a = {};
Làm thế nào tôi có thể kiểm tra xem đó là trường hợp?
if( Object.entries(a).length > 0){ //do }
Câu trả lời:
ECMA 5+ :
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object
Tuy nhiên, lưu ý rằng điều này tạo ra một mảng không cần thiết (giá trị trả về của keys
).
Trước 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
nhà nghỉ :
_.isEmpty({}); // true
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
Object.keys(new Date()).length === 0
; vì vậy câu trả lời này có thể gây hiểu nhầm
(new Date()).constructor === Date
, hoặc ngược lại , ({}).constructor === Object
.
Object.keys()
không kiểm tra các thuộc tính hoặc ký hiệu không thể đếm được. Bạn cần sử dụng Object.getOwnPropertyNames()
và Object.getOwnPropertySymbols()
thay vào đó. Ngoài ra, Object.getPrototypeOf()
là cách chính xác để có được nguyên mẫu của một đối tượng. obj.constructor
có thể dễ dàng giả mạo. Ví dụ : function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
.
Không có cách nào dễ dàng để làm điều này. Bạn sẽ phải lặp lại các thuộc tính một cách rõ ràng:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
Nếu có hỗ trợ ECMAScript 5 , bạn có thể sử dụng Object.keys()
thay thế:
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
isEmpty()
, vì vậy nó sẽ trả về false
nếu có tài sản
Đối với những người có cùng vấn đề nhưng sử dụng jQuery, bạn có thể sử dụng jQuery.isEmptyObject .
underscore.js
...
Đây là giải pháp ưa thích của tôi:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Object.keys(new Date()).length === 0
; vì vậy câu trả lời này có thể gây hiểu nhầm
new Date()
không phải là một đối tượng. nd = new Date(); nd.constructor === Object;
kết quả trong false
.
Bạn có thể sử dụng Underscore.js .
_.isEmpty({}); // true
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
xem http://bencollier.net/2011/04/javascript-is-an-object-empty/
Object.getOwnPropertyNames(new Date()).length === 0
; vì vậy câu trả lời này có thể gây hiểu nhầm
Làm thế nào về việc sử dụng JSON.opesify? Nó gần như có sẵn trong tất cả các trình duyệt hiện đại.
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
Tôi vừa gặp phải một tình huống tương tự. Tôi không muốn sử dụng JQuery và muốn làm điều này bằng Javascript thuần túy.
Và những gì tôi đã làm là, sử dụng điều kiện sau đây, và nó đã làm việc cho tôi.
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
Để không bằng, sử dụng này: JSON.stringify(obj) !== '{}'
Hãy xem JSFiddle này
Câu hỏi cũ, nhưng chỉ có vấn đề. Bao gồm JQuery không thực sự là một ý tưởng tốt nếu mục đích duy nhất của bạn là kiểm tra xem đối tượng có trống không. Thay vào đó, chỉ cần đi sâu vào mã của JQuery và bạn sẽ nhận được câu trả lời:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
Có một cách đơn giản nếu bạn đang ở trên một trình duyệt mới hơn.
Object.keys(obj).length == 0
Object.keys
là một phương thức tiêu chuẩn nhưng các đối tượng không có thuộc tính khóa. Vì vậy, mã này sẽ báo cáo bất kỳ đối tượng nào là trống, ngoại trừ việc nó vô tình có một thuộc tính được đặt tên key
với một giá trị mà lại là một thuộc tính có tên length
khác không. Kinh khủng!
Object.keys(new Date()).length === 0
; vì vậy câu trả lời này có thể gây hiểu nhầm
Hôm nay 2020.01.17 Tôi thực hiện các thử nghiệm trên MacOs HighSierra 10.13.6 trên Chrome v79.0, Safari v13.0.4 và Firefox v72.0, cho các giải pháp được chọn.
Kết luận
for-in
(A, J, L, M) là nhanh nhấtJSON.stringify
(B, K) là chậmObject
(N) là chậmDưới đây trong đoạn trích được trình bày 15 giải pháp. Nếu bạn muốn chạy thử nghiệm hiệu năng trên máy của bạn bấm vào ĐÂY .
Sử dụng Object.keys (obj) .length (như được đề xuất ở trên cho ECMA 5+) chậm hơn 10 lần đối với các đối tượng trống! giữ với tùy chọn trường học cũ (cho ... trong).
Được thử nghiệm dưới Node, Chrome, Firefox và IE 9, điều hiển nhiên là đối với hầu hết các trường hợp sử dụng:
Hiệu suất dòng dưới cùng, sử dụng:
function isEmpty(obj) {
for (var x in obj) { return false; }
return true;
}
hoặc là
function isEmpty(obj) {
for (var x in obj) { if (obj.hasOwnProperty(x)) return false; }
return true;
}
Xem kết quả kiểm tra chi tiết và mã kiểm tra tại Đối tượng có trống không?
Object.keys
là chậm, nhưng ít mã hơn. Trên một trang nhỏ, nơi cái này được gọi là ... có thể 10 lần ... Điều này có còn chậm hơn khi xem xét thời gian phân tích cú pháp bổ sung của mã bổ sung không?
Bạn có thể kiểm tra số lượng các phím Object:
if (Object.keys(a).length > 0) {
// not empty
}
Chỉ là một cách giải quyết. Máy chủ của bạn có thể tạo một số tài sản đặc biệt trong trường hợp không có dữ liệu?
Ví dụ:
var a = {empty:true};
Sau đó, bạn có thể dễ dàng kiểm tra nó trong mã gọi lại AJAX của bạn.
Một cách khác để kiểm tra nó:
if (a.toSource() === "({})") // then 'a' is empty
EDIT : Nếu bạn sử dụng bất kỳ thư viện JSON (fe JSON.js) thì bạn có thể thử hàm JSON.encode () và kiểm tra kết quả dựa trên chuỗi giá trị trống.
toSource()
là không chuẩn và không hoạt động trong IE hoặc Opera (và có khả năng các trình duyệt khác tôi không kiểm tra)
toSource
tài sản trong phần 15.2.4; theo MDC, nó đã được giới thiệu trong JS1.3 (tức là Netscape Navigator 4.06), nhưng nó KHÔNG có trong ECMA-262, phiên bản thứ 3!
toSource()
là một cách khủng khiếp để làm điều này (như là JSON.encode()
). Nó cần xây dựng một chuỗi đại diện cho toàn bộ đối tượng của bạn để kiểm tra xem nó có trống không. Có rất nhiều chi phí chuyển đổi mọi thứ thành chuỗi, nhưng hơn nữa, nó sẽ cần chuyển đổi một triệu thứ nếu đối tượng của bạn có một triệu thuộc tính, trong khi thực sự chỉ cần nhìn vào một thứ sẽ cho bạn biết rằng nó không trống.
Tôi đã tạo một hàm hoàn chỉnh để xác định xem đối tượng có trống không.
Nó sử dụng Object.keys
từ chức năng ECMAScript 5 (ES5) nếu có thể để đạt được hiệu suất tốt nhất (xem bảng tương thích ) và dự phòng cho cách tiếp cận tương thích nhất cho các công cụ cũ hơn (trình duyệt).
/**
* 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;
}
}
Đây là Gist cho mã này.
Và đây là JSFiddle với trình diễn và một bài kiểm tra đơn giản.
Tôi hy vọng nó sẽ giúp được ai đó. Chúc mừng!
Object.keys(new Date()).length === 0
; vì vậy câu trả lời này có thể gây hiểu nhầm
Tôi đang sử dụng này.
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;
}
Ví dụ:
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;
Cập nhật
HOẶC LÀ
bạn có thể sử dụng triển khai jQuery của isEmptyObject
function isEmptyObject(obj) {
var name;
for (name in obj) {
return false;
}
return true;
}
Ví dụ sau đây cho thấy cách kiểm tra xem một đối tượng JavaScript có trống không, nếu trống, chúng tôi có nghĩa là không có thuộc tính riêng cho nó.
Kịch bản hoạt động trên 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
Theo thông số kỹ thuật ES2017 trên Object.entries () , việc kiểm tra rất đơn giản khi sử dụng bất kỳ trình duyệt hiện đại nào--
Object.entries({}).length === 0
Object.keys
hay Object.values
?
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
Object
với một phương thức thông qua chuỗi nguyên mẫu, bởi vì đó là vô số và for in
câu lệnh lặp qua các thuộc tính vô số.
jQuery có chức năng đặc biệt isEmptyObject()
cho trường hợp này:
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
Đọc thêm về http://api.jquery.com/jQuery.isEmptyObject/
Tôi sẽ đi kiểm tra nếu nó có ít nhất một khóa. Điều đó đủ để nói với tôi rằng nó không trống rỗng.
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
false
giá trị thì sao? kết quả sẽ false
không chính xác.
Dưới mui xe, tất cả các phương thức kiểm tra trống trong tất cả các thư viện đều sử dụng các khóa đối tượng kiểm tra logic. Đó là một cách kỳ lạ để làm cho nó dễ hiểu, mà bạn có thể đặt trong một phương thức, Mô tả ở đây .
for(key in obj){
//your work here.
break;
}
Điều này đã phát triển trong ES5 , giờ chỉ đơn giản là bạn có thể kiểm tra độ dài khóa của đối tượng, sử dụng Object.Keys
phương thức lấy đối tượng của bạn làm tham số:
if(Object.keys(obj).length > 0){
//do your work here
}
Hoặc nếu bạn đang sử dụng Lodash (bạn phải) thì.
_.isEmpty(obj) //==true or false
bạn có thể sử dụng mã đơn giản không sử dụng jQuery hoặc các thư viện khác
var a=({});
//check is an empty object
if(JSON.stringify(a)=='{}') {
alert('it is empty');
} else {
alert('it is not empty');
}
Lớp JSON và các hàm của nó ( phân tích cú pháp và chuỗi hóa ) rất hữu ích nhưng có một số vấn đề với IE7 mà bạn có thể khắc phục nó bằng mã đơn giản này http://www.json.org/js.html .
Cách đơn giản khác (cách đơn giản nhất):
bạn có thể sử dụng cách này mà không cần sử dụng đối tượng jQuery hoặc 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
Cách tốt nhất mà tôi tìm thấy:
function isEmpty(obj)
{
if (!obj)
{
return true;
}
if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
{
return true;
}
return false;
}
Hoạt động cho:
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)
.
Tôi lấy:
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
Chỉ là, tôi không nghĩ rằng tất cả các trình duyệt hiện Object.keys()
đang thực hiện.
Object.keys(new Date()).length === 0
; vì vậy câu trả lời này có thể gây hiểu nhầm
Nếu jQuery và trình duyệt web không có sẵn, thì cũng có một hàm isEmpty trong underscore.js.
_.isEmpty({}) // returns true
Ngoài ra, nó không giả sử tham số đầu vào là một đối tượng. Đối với một danh sách hoặc chuỗi hoặc không xác định, nó cũng sẽ biến câu trả lời đúng.
Hãy cẩn thận! Cảnh giác với những hạn chế của 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 ) );
màn hình
Coi chừng !! obj KHÔNG trống! obj = {f: function () {}} JSON.opesify (obj) trả lại {}
Đáp án đúng là:
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
Điều này kiểm tra rằng:
Object.prototype
.Nói cách khác, đối tượng không thể phân biệt với một đối tượng được tạo bằng {}
.
Ngoài câu trả lời của Thevs:
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
đó là jquery + jquery.json
$.isEmptyObject()
, đừng lãng phí chu kỳ với các chuyển đổi không rõ ràng.
Đường.JS cung cấp các đối tượng mở rộng cho mục đích này. Mã sạch và đơn giản:
Tạo một đối tượng mở rộng:
a = Object.extended({})
Kiểm tra kích thước của nó:
a.size()