Làm cách nào để kiểm tra một đối tượng JavaScript trống?


3110

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?


7
Bạn có sử dụng tập lệnh JSON.js không? Hoặc bất kỳ thư viện JSON nào khác. Sau đó, bạn có thể sử dụng hàm JSON.encode () để chuyển đổi var thành chuỗi và sau đó kiểm tra nó.
Thevs

if( Object.entries(a).length > 0){ //do }
Muhammad Shahzad

Câu trả lời:


5425

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

Gạch dưới :

_.isEmpty({}); // true

Hoek

Hoek.deepEqual({}, {}); // true

ExtJS

Ext.Object.isEmpty({}); // true

AngularJS (phiên bản 1)

angular.equals({}, {}); // true

Ramda

R.isEmpty({}); // true

22
Dưới đây là bài kiểm tra hiệu năng giữa jQuery và gạch dưới jsperf.com/isempty-vs-isemptyobject/6
Mikhail

20
Object.keys(new Date()).length === 0; vì vậy câu trả lời này có thể gây hiểu nhầm
cjbarth

6
Thay vì xâu chuỗi những thứ bạn cũng có thể tận dụng thực tế này : (new Date()).constructor === Date, hoặc ngược lại , ({}).constructor === Object.
John Nelson

2
angular.equals ({}, {});
Jeremy A. West

11
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()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.constructorcó thể dễ dàng giả mạo. Ví dụ : function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true.
Jesse

863

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;
}

56
Điều này hoạt động tốt, hoặc đơn giản hơn: function isEmpty (object) {for (var i in object) {return true; } trả về sai; }
Nicholas Kreidberg

36
Không nên đúng và sai trong chức năng này?
namtax

25
@namtax: không - chức năng được đặt tên isEmpty(), vì vậy nó sẽ trả về falsenếu có tài sản
Christoph

6
đối tượng trống sẽ mở rộng lớp Object mặc định nhưng nếu nguyên mẫu đối tượng được sửa đổi, hàm đơn giản hóa của bạn sẽ không xem xét: Object.prototype.a = 'hi'; var obj = {}; cảnh giác (obj.a); // xuất ra "hi" isEmpty (obj) // trả về false
venimus

29
Bạn không nên sử dụng ví dụ thứ hai vì độ phức tạp thời gian O (n) và độ phức tạp không gian O (n), trong khi đầu tiên là O (1).
Brian

572

Đố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 .


43
CHÀO! Tôi chỉ mất vài giờ để gỡ lỗi các vấn đề của IE 8 chỉ để thấy rằng đó là jQuery.isEmptyObject gây ra sự cố. Nó trả về true nếu đối tượng trống.
MFD3000

162
Tại sao bạn đăng câu trả lời bao gồm jQuery nếu câu hỏi hoàn toàn không phải về jQuery?
Eru

47
Tôi biết một bình luận cũ của nó, nhưng tôi tự hỏi câu hỏi của bạn @ MFD3000, vì docu nói: trả về true nếu đối tượng là rỗng (như tên cho thấy nó)
Александр Фишер

21
bao gồm jQuery cho một nhiệm vụ cơ bản như vậy không phải là điều tôi sẽ gọi đúng câu trả lời. Đúng là ngày nay jQuery gần như có mặt ở khắp mọi nơi, nhưng chúng ta vẫn không nên quên nó được xây dựng xung quanh một ngôn ngữ rất có khả năng.
Pablo Mescher

54
Điển hình hợm hĩnh trong những bình luận này Mọi người đều biết một tỷ lệ lớn JavaScript trên web được viết trên jQuery, vì vậy việc cung cấp giải pháp tại đây cho jQuery là hoàn toàn chấp nhận được nếu nó đã có một phương thức tích hợp sẵn để kiểm tra các đối tượng. Có khả năng hàng ngàn nhà phát triển đang tìm kiếm trợ giúp sẽ thấy câu trả lời này hữu ích. Không ai nói đó là cách duy nhất để làm điều đó. Tôi nhận thấy cách không ai hành động tất cả những người ưu tú về anh chàng đã đăng một giải pháp để sử dụng underscore.js...
BadHorsie 7/07/2015

276

Đâ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

1
Vấn đề tương thích với IE9 BTW. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
triệt

3
@Jero Franzani: không, không
nikoskip

Chiều dài của Object.keys ({}) chậm hơn 10 lần so với tùy chọn (cho ... trong ...) - Tôi khuyên bạn nên tránh nó như một cách để kiểm tra xem objetc có trống không.
davidhadas

10
Object.keys(new Date()).length === 0; vì vậy câu trả lời này có thể gây hiểu nhầm
cjbarth

new Date()không phải là một đối tượng. nd = new Date(); nd.constructor === Object;kết quả trong false.
pors

204

Bạn có thể sử dụng Underscore.js .

_.isEmpty({}); // true

19
Hoặc bạn có thể sử dụng lodash là trống ( lodash.com/docs#isEmpty ), nhưng nó khác với việc sử dụng giải pháp jQuery như thế nào - bạn vẫn cần cài đặt một thư viện bổ sung. Tôi nghĩ rằng một giải pháp javascript vanilla là ý định.
tfmontague

10
Sẽ khác nếu bạn muốn sử dụng JS trên phần phụ trợ với Node.js. Rất ít người sẽ muốn sử dụng jQuery (một thư viện front-end được sử dụng chủ yếu cho các thao tác DOM) trên phần phụ trợ.
Nahn

3
@tfmontague gạch dưới rất phổ biến trên các ứng dụng nút, gần như phổ biến như jQ ở phía máy khách. Tôi đã có dấu gạch dưới yêu cầu nhưng không nhận ra nó có chức năng này
rw-nandemo

5
Gạch dưới đang được thay thế bằng lodash. Sử dụng thay thế.
demisx

2
Chỉ cần cẩn thận với các loại Ngày, isEmpty luôn trả về đúng cho Ngày, xem github.com/jashkenas/underscore/issues/445
mentat

116
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

xem http://bencollier.net/2011/04/javascript-is-an-object-empty/


5
Điều này bao gồm các thuộc tính không thể đếm được, trong trường hợp bạn quan tâm.

Object.getOwnPropertyNames ({}). Độ dài chậm hơn 10 lần so với tùy chọn (cho ... trong ...) - Tôi khuyên bạn nên tránh nó như một cách để kiểm tra xem objetc có trống không.
davidhadas

4
Object.getOwnPropertyNames(new Date()).length === 0; vì vậy câu trả lời này có thể gây hiểu nhầm
cjbarth

80

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) === '{}';
}

23
return (JSON.opesify (obj) == '{}')
Vic

26
Đây là vấn đề chậm và tốc độ cho loại tiện ích này. Kiểm tra sự hoàn hảo nhanh chóng tại đây: jsperf.com/empty-object-test

1
Đây là một tùy chọn rất chậm - tôi đề nghị sử dụng tùy chọn (cho ... trong) thay vào đó
davidhadas

2
Và nó không hoạt động cho các đối tượng có chức năng.
Felix Kling

1
Nó cũng sẽ đưa ra một lỗi nếu có một tham chiếu tròn trong đối tượng. Vì vậy, nó chậm, không đáng tin cậy và có thể ném lỗi và phá vỡ mọi thứ khác. Không có lý do để sử dụng nó bao giờ.
Burak

62

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


4
Sẽ thất bại đối với các đối tượng có tham chiếu vòng tròn như JSON.opesify đặc biệt ném ngoại lệ cho chúng.
Pedro Montoto García

1
@ PedroMontotoGarcía Ok và làm thế nào một đối tượng trống sẽ có một tham chiếu vòng tròn?
KthProg

8
Nếu đối tượng không trống (và nó cũng sẽ hoạt động với chúng).
Pedro Montoto García

Điều này dường như đã được đề cập bởi @Ateszki và là một trong những cách chậm nhất để kiểm tra xem một đối tượng không trống.
thúc

Ồ vâng .. Tôi đã bỏ lỡ nó. Tôi gặp phải một tình huống mà tôi muốn đạt được javascript này và sau một chút suy nghĩ tôi đã tìm ra cách này. @Ateszki, Ngay cả tôi mặc dù cách bạn đã làm. :-) Btw, có rất nhiều câu trả lời về điều này, và vì vậy tôi đã bỏ lỡ câu trả lời của bạn.
Anish Nair

60

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;
}

5
Điều này chỉ hữu ích nếu một số quy trình khác chưa thêm nguyên mẫu vào đối tượng cơ sở của bạn. Để làm cho điều này thực sự khả thi, bạn cần kiểm tra obj.hasOwnProperty (tên)
mpemburn

1
Điều này không thêm bất cứ điều gì vào câu trả lời của Christoph từ năm 2009.
Dan Dascalescu

39

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


1
Trường hợp không keyssở hữu đến từ đâu?

2
Đây là một phương pháp tiêu chuẩn trong ECMAScript 5.1
tải xuống

1
Làm thế nào để nhận xét trên có 4 upvote? Có, Object.keyslà 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 keyvới một giá trị mà lại là một thuộc tính có tên lengthkhác không. Kinh khủng!
cào bằ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
cjbarth

11
@scravy Object là lớp Object. Đối tượng có một phương thức tĩnh có tên 'khóa' chấp nhận một đối tượng làm đối số. Phương thức này trả về một chuỗi các chuỗi trong đó các chuỗi là tên thuộc tính. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
mẹo

34

Hiệu suất

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

  • các giải pháp dựa trên for-in(A, J, L, M) là nhanh nhất
  • các giải pháp dựa trên JSON.stringify(B, K) là chậm
  • đáng ngạc nhiên là giải pháp dựa trên Object(N) là chậm

nhập mô tả hình ảnh ở đây

Chi tiết

Dướ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 .

nhập mô tả hình ảnh ở đây


rất nhiều điều này không có ý nghĩa gì vì bạn đang dựa trên tất cả mọi thứ về sự trở lại của sai và đúng. Đôi khi lập trình cần một câu lệnh if hoặc toán tử ternary. chỉ fyi
Christian Matthew

1
Đó là câu trả lời tốt nhất, cảm ơn bạn, giải pháp đầu tiên hoạt động như một cơ duyên
Carlos Jesus Arancactus Taborga

33

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:

  • (cho ... trong ...) là tùy chọn nhanh nhất để sử dụng!
  • Object.keys (obj) .length chậm hơn 10 lần đối với các đối tượng trống
  • JSON.opesify (obj) .length luôn chậm nhất (không gây ngạc nhiên)
  • Object.getOwnPropertyNames (obj) .length mất nhiều thời gian hơn Object.keys (obj) .length có thể lâu hơn trên một số hệ thố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.keyslà 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?
yankee

32

Bạn có thể kiểm tra số lượng các phím Object:

if (Object.keys(a).length > 0) {
    // not empty
}

8
Tại sao bạn lại thêm một bình luận cho một câu trả lời đã được đưa ra và đưa ra một câu trả lời tồi tệ hơn? stackoverflow.com/a/32108184/4229159 và đó là câu trả lời đầu tiên từ tháng 4
Alejandro Vales

Làm thế nào nếu tôi có một đối tượng rất lớn và làm điều đó trên mỗi vòng lặp chỉ để xem liệu đối tượng đó có trống không?
StefansArya

27
  1. 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.

  2. 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.


6
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)
Christoph

4
@Thevs: có lẽ bạn có một bản sao khác của phiên bản hiện tại của ECMA-262, nhưng tôi không liệt kê một toSourcetà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!
Christoph

4
@Thevs: tốt, ít nhất 2 nhà cung cấp trình duyệt quan trọng đã không triển khai nó, do đó, nó hầu như không phải là tiêu chuẩn thực tế, và vì nó không có trong ECMA-262, nó cũng không phải là một thực tế ...
Christoph

4
Ngay cả khi nó hoạt động, 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.
Jasper

4
@ Đó là chi phí lớn hơn, ngay cả khi nó có thể (tôi không chắc nó ở trong mọi tình huống) theo cùng một thứ tự cường độ. Tuy nhiên, câu trả lời đó liên quan đến việc trả lại sai ngay khi tìm thấy một tài sản khác nhau khiến câu chuyện hoàn toàn khác nhau ...
Jasper

25

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.keystừ 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).

Giải pháp

/**
 * 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!


3
Điều này thất bại cho một nullđối tượng.

Xin chào @torazaburo! Cảm ơn bạn đã thông báo! Tôi đã cập nhật tất cả các nguồn với việc thực hiện chính xác.
Slava Fomin II

1
Chiều dài của Object.keys ({}) chậm hơn 10 lần so với tùy chọn (cho ... trong ...) - Tôi khuyên bạn nên tránh nó như một cách để kiểm tra xem objetc có trống không.
davidhadas

1
Object.keys(new Date()).length === 0; vì vậy câu trả lời này có thể gây hiểu nhầm
cjbarth

19

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;

từ đây

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;
}

Chào. khi bạn kiểm tra hàm này với số hoặc boolean true hoặc false trả về true và đây không phải là kết quả đúng. isObjectEmpty (đúng). isObjectEmpty (sai). isObjectEmpty (1)
iman

2
Chúng tôi đang kiểm tra xem đối tượng có trống không, nếu kiểu dữ liệu là một đối tượng. Trong trường hợp của bạn để kiểm tra xem nó có phải là một đối tượng không, chúng ta cần một cái gì đó như if (typeof a === "object") {...}
kiranvj

15

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


15

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

3
Có bất kỳ lợi ích để sử dụng này hơn Object.keyshay Object.values?
ngất xỉu

@faintsignal sử dụng chúng là hoàn toàn tốt. Tôi chỉ thêm các mục như không tìm thấy nó trong các ý kiến.
Viking

13
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}

4
Điều đó cũng sẽ báo cáo đúng, khi, ví dụ, khi một thư viện JavaScript mở rộng Objectvới một phương thức thông qua chuỗi nguyên mẫu, bởi vì đó là vô số và for incâu lệnh lặp qua các thuộc tính vô số.
viam0Zah

12

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/


12

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])

1
Nếu khóa đầu tiên trả về falsegiá trị thì sao? kết quả sẽ falsekhông chính xác.
Jimmy Obonyo Abor

Tôi đã thử nghiệm cho điều đó. Bạn có thể đưa ra một ví dụ làm việc?
Tudor Morar

1
Điều này ngắn và súc tích, nhưng sẽ dẫn đến lỗi thời gian chạy nếu Đối tượng không được xác định
Mrinmoy

11

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.Keysphươ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

Trong khi đó là chính xác như một cách kỳ lạ để tạo một câu lệnh if - nó có thể sẽ gây nhầm lẫn cho ai đó sẽ duy trì mã sau bạn.
Soren

10


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ápchuỗ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

JSON.stringifygiải pháp thất bại nếu đối tượng chứa các thuộc tính không thể mã hóa như hàm hoặc "không xác định", mặc dù được cho là trường hợp cạnh.

10

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

3
Tôi sẽ nói rằng 0 không trống vì nó thực sự là một số. mọi thứ khác có vẻ tốt nhưng sửa chữa là dễ dàng. trong câu lệnh if đầu tiên thêm điều này. if (!obj && obj !== 0).
mjwrazor

9

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.


2
Object.keys(new Date()).length === 0; vì vậy câu trả lời này có thể gây hiểu nhầm
cjbarth

3
Phụ thuộc nếu bạn coi một ngày luôn luôn "đầy đủ" mặc dù không bao giờ để lộ khóa. Nhưng tôi đồng ý rằng nếu đó là kế hoạch của bạn, thêm một số kiểm tra thể hiện bổ sung cho hàm tạo ngày là một lựa chọn tốt.
NiKo


7

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

    {}

7

Đá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:

  • Đối tượng không có thuộc tính riêng (bất kể liệt kê).
  • Đối tượng không có biểu tượng tài sản riêng.
  • Nguyên mẫu của đối tượng là chính xác 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 {}.


6

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


Tôi không thích sử dụng JSON vì nó không thể hoạt động với các cấu trúc đối tượng hình tròn.
itdoesntwork

2
Nếu trang của bạn tải jQuery thì hãy sử dụng $.isEmptyObject(), đừng lãng phí chu kỳ với các chuyển đổi không rõ ràng.
skierpage 7/2/2015

6

Đườ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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.