ฉันจะทดสอบวัตถุ JavaScript ที่ว่างได้อย่างไร


3107

หลังจากคำขอ AJAX บางครั้งแอปพลิเคชันของฉันอาจส่งคืนวัตถุว่างเปล่าเช่น:

var a = {};

ฉันจะตรวจสอบว่าเป็นอย่างนั้นได้อย่างไร


7
คุณใช้สคริปต์ JSON.js หรือไม่ หรือไลบรารี JSON อื่น ๆ จากนั้นคุณสามารถใช้ฟังก์ชัน JSON.encode () เพื่อแปลง var เป็นสตริงและทดสอบ
Thevs

if( Object.entries(a).length > 0){ //do }
มูฮัมหมัดชาห์ซาด

คำตอบ:


5420

ECMA 5+ :

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

อย่างไรก็ตามโปรดทราบว่าสิ่งนี้จะสร้างอาร์เรย์ที่ไม่จำเป็น (ค่าส่งคืนของkeys)

Pre-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

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

ExtJS

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

AngularJS (รุ่น 1)

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

Ramda

R.isEmpty({}); // true

22
นี่คือการทดสอบประสิทธิภาพระหว่าง jQuery และขีดล่างjsperf.com/isempty-vs-isemptyobject/6
Mikhail

20
Object.keys(new Date()).length === 0; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
cjbarth

6
แทนที่จะ stringifying สิ่งที่คุณยังสามารถใช้ประโยชน์จากความจริงนี้หรือตรงกันข้าม(new Date()).constructor === Date ({}).constructor === Object
จอห์นเนลสัน

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

11
Object.keys()ไม่ตรวจสอบคุณสมบัติหรือสัญลักษณ์ที่ไม่สามารถนับได้ คุณต้องใช้Object.getOwnPropertyNames()และObject.getOwnPropertySymbols()แทน นอกจากนี้ยังObject.getPrototypeOf()เป็นวิธีที่ถูกต้องในการรับต้นแบบของวัตถุ obj.constructorสามารถปลอมแปลงได้ง่าย ตัวอย่าง: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true.
เจสซี

862

ไม่มีวิธีง่ายๆในการทำเช่นนี้ คุณจะต้องวนซ้ำคุณสมบัติอย่างชัดเจน:

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

56
มันใช้งานได้ดีหรือมากกว่านั้นง่ายๆคือ function isEmpty (object) {สำหรับ (var i ใน object) {return true; } คืนค่าเท็จ }
Nicholas Kreidberg

36
ฟังก์ชั่นนี้ไม่ควรกลับด้านจริงและเท็จ?
namtax

25
@ ชื่อไวยากรณ์: ไม่ - มีการตั้งชื่อฟังก์ชั่นisEmpty()ดังนั้นจึงควรส่งคืนfalseถ้ามีคุณสมบัติ
Christoph

6
วัตถุว่างจะขยายคลาสวัตถุเริ่มต้น แต่ถ้าต้นแบบวัตถุถูกดัดแปลงฟังก์ชันที่ง่ายของคุณจะล้มเหลวให้พิจารณา: Object.prototype.a = 'hi'; var obj = {}; การแจ้งเตือน (obj.a); // เอาต์พุต "hi" isEmpty (obj) // ส่งคืน false
venimus

29
คุณไม่ควรใช้ตัวอย่างที่สองเนื่องจากความซับซ้อนของเวลา O (n) และความซับซ้อนของพื้นที่ O (n) ในขณะที่สิ่งแรกคือ O (1)
Brian

572

สำหรับบรรดาของคุณที่มีปัญหาเดียวกัน แต่ใช้ jQuery คุณสามารถใช้jQuery.isEmptyObject


43
Hey! ฉันเพิ่งใช้เวลาไม่กี่ชั่วโมงในการดีบักปัญหา IE 8 เท่านั้นที่พบว่าเป็น jQuery.isEmptyObject ที่ทำให้เกิดปัญหา มันจะส่งกลับจริงถ้าวัตถุว่างเปล่า
MFD3000

162
ทำไมคุณโพสต์คำตอบรวมถึง jQuery หากคำถามไม่เกี่ยวกับ jQuery เลย?
Eru

47
ฉันรู้ว่ามันเป็นความคิดเห็นเก่า แต่ฉันสงสัยคำถามของคุณ @ MFD3000 เพราะ docu พูดว่า: คืนค่าจริงถ้าวัตถุว่างเปล่า (ตามชื่อระบุ)
АлександрФишер

21
รวมถึง jQuery สำหรับภารกิจพื้นฐานไม่ใช่สิ่งที่ฉันจะเรียกคำตอบที่ถูกต้อง เป็นความจริงที่ทุกวันนี้ jQuery เกือบจะแพร่หลาย แต่ก็ยังไม่ควรลืมว่ามันถูกสร้างขึ้นด้วยภาษาที่มีความสามารถมาก
Pablo Mescher

54
JS หัวสูงทั่วไปในความคิดเห็นเหล่านี้ ทุกคนรู้ว่าส่วนใหญ่ของ JavaScript บนเว็บถูกเขียนบน jQuery ดังนั้นจึงเป็นที่ยอมรับได้อย่างสมบูรณ์ในการจัดหาโซลูชันที่นี่สำหรับ jQuery หากมีวิธีการทดสอบวัตถุในตัวอยู่แล้ว เป็นไปได้ว่านักพัฒนาซอฟต์แวร์หลายพันคนที่กำลังมองหาความช่วยเหลือจะพบว่าคำตอบนี้มีประโยชน์ ไม่มีใครพูดว่ามันเป็นวิธีเดียวที่จะทำได้ ฉันสังเกตเห็นว่าไม่มีใครกระทำการชั้นนำทั้งหมดเกี่ยวกับผู้ชายที่โพสต์วิธีแก้ปัญหาในการใช้underscore.js...
BadHorsie

276

นี่คือทางออกที่ฉันต้องการ:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty

1
ปัญหาความเข้ากันได้กับ IE9 BTW developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

3
@Jero Franzani: ไม่
เป็นไร

ความยาว Object.keys ({}) นั้นช้ากว่าตัวเลือก (สำหรับ ... ใน ... ) 10 เท่า - ฉันแนะนำให้หลีกเลี่ยงเป็นวิธีทดสอบว่า objetc ว่างเปล่าหรือไม่
davidhadas

10
Object.keys(new Date()).length === 0; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
cjbarth

new Date()ไม่ใช่วัตถุ ผลในการnd = new Date(); nd.constructor === Object; false
pors

204

คุณสามารถใช้Underscore.js

_.isEmpty({}); // true

19
หรือคุณสามารถใช้ lodash ว่างเปล่าได้ ( lodash.com/docs#isEmpty ) แต่สิ่งที่แตกต่างจากการใช้โซลูชัน jQuery - คุณยังคงต้องติดตั้งไลบรารีเพิ่มเติม ฉันคิดว่าโซลูชันจาวาสคริปต์วานิลลาเป็นเจตนา
tfmontague

10
มันแตกต่างกันถ้าคุณต้องการใช้ JS บนแบ็กเอนด์ด้วย Node.js มีเพียงไม่กี่คนที่ต้องการใช้ jQuery (ไลบรารีส่วนหน้าที่ใช้สำหรับการจัดทำ DOM) ในส่วนแบ็กเอนด์
Nahn

3
@tfmontague underscore พบได้บ่อยมากในแอพโหนดเกือบจะแพร่หลายเหมือนกับ jQ ที่อยู่ฝั่งไคลเอ็นต์ ฉันต้องการขีดล่างแล้ว แต่ไม่ทราบว่ามันมีฟังก์ชั่นนี้
rw-nandemo

5
ขีดเส้นใต้จะถูกแทนที่ด้วย Lodash ใช้สิ่งนั้นแทน
demisx

2
โปรดระวังด้วยประเภทวันที่ isEmpty จะคืนค่าเป็นจริงสำหรับวันที่เสมอดูgithub.com/jashkenas/underscore/issues/445
2559

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

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


5
ซึ่งรวมถึงคุณสมบัติที่ไม่นับจำนวนในกรณีที่คุณสนใจ

Object.getOwnPropertyNames ({}). ความยาวนั้นช้ากว่าตัวเลือก (สำหรับ ... ใน ... ) 10 เท่า - ฉันแนะนำให้หลีกเลี่ยงวิธีการทดสอบว่า objetc ว่างเปล่าหรือไม่
davidhadas

4
Object.getOwnPropertyNames(new Date()).length === 0; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
cjbarth

80

วิธีการเกี่ยวกับการใช้ JSON.stringify มันเกือบจะมีอยู่ในเบราว์เซอร์ที่ทันสมัยทั้งหมด

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

23
ผลตอบแทน (JSON.stringify (obj) == '{}')
วิก

26
นี่เป็นเรื่องที่ช้าและเร็วสำหรับยูทิลิตี้ประเภทนี้ การทดสอบ perf ด่วนอย่างรวดเร็วที่นี่: jsperf.com/empty-object-test

1
นี่เป็นตัวเลือกที่ช้ามาก - ฉันแนะนำให้ใช้ตัวเลือก (สำหรับ ... ใน) แทน
davidhadas

2
และมันไม่ทำงานสำหรับวัตถุที่มีฟังก์ชั่น
เฟลิกซ์คลิง

1
นอกจากนี้ยังจะโยนข้อผิดพลาดหากมีการอ้างอิงแบบวงกลมในวัตถุ ดังนั้นจึงช้าไม่น่าเชื่อถือและสามารถโยนข้อผิดพลาดและทำลายทุกอย่างอื่น ไม่มีเหตุผลที่จะใช้มันเลยทีเดียว
Burak

62

ฉันเพิ่งเจอสถานการณ์ที่คล้ายกัน ฉันไม่ต้องการใช้ JQuery และต้องการทำสิ่งนี้โดยใช้ Javascript แท้ๆ

และสิ่งที่ฉันทำคือใช้เงื่อนไขต่อไปนี้และมันก็ได้ผลสำหรับฉัน

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
   //Code here..
}

เพื่อไม่เท่ากับใช้สิ่งนี้: JSON.stringify(obj) !== '{}'

ตรวจสอบJSFiddleนี้


4
จะล้มเหลวสำหรับวัตถุที่มีการอ้างอิงแบบวงกลมเนื่องจาก JSON.stringify จะส่งข้อยกเว้นพิเศษมา
Pedro Montoto García

1
@ PedroMontotoGarcíaตกลงและวัตถุว่างเปล่าจะมีการอ้างอิงแบบวงกลมอย่างไร
KthProg

8
ถ้าวัตถุนั้นไม่ว่างเปล่า (และมันก็ควรใช้ได้กับพวกมันด้วย)
Pedro Montoto García

ดูเหมือนว่าจะมีการกล่าวถึงแล้วโดย @Ateszki และเป็นหนึ่งในวิธีที่ช้าที่สุดในการตรวจสอบว่าวัตถุไม่ว่างเปล่า
cwadding

โอ้ใช่ .. ฉันคิดถึงมัน ฉันวิ่งเข้าไปในสถานการณ์ที่ฉันต้องการบรรลุจาวาสคริปต์นี้และหลังจากนั้นฉันก็คิดว่าฉันจะหาวิธีนี้ได้ @ Ateszki แม้ว่าฉันจะเป็นอย่างที่คุณทำ :-) Btw มีคำตอบมากมายเกี่ยวกับเรื่องนี้และดังนั้นฉันจึงพลาดคำตอบของคุณ
Anish Nair

60

คำถามเก่า แต่เพิ่งมีปัญหา การรวม JQuery ไม่ใช่ความคิดที่ดีหากวัตถุประสงค์เพียงอย่างเดียวของคุณคือการตรวจสอบว่าวัตถุนั้นไม่ว่างเปล่าหรือไม่ ให้ลึกเข้าไปในโค้ดของ JQueryและคุณจะได้คำตอบ:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}

5
สิ่งนี้มีประโยชน์ก็ต่อเมื่อกระบวนการอื่นไม่ได้เพิ่มต้นแบบลงในวัตถุฐานของคุณ เพื่อให้สามารถใช้งานได้จริงคุณจะต้องทดสอบ obj.hasOwnProperty (ชื่อ)
mpemburn

1
สิ่งนี้ไม่ได้เพิ่มอะไรเลยกับคำตอบของ Christophตั้งแต่ปี 2009
Dan Dascalescu

39

มีวิธีง่าย ๆ ถ้าคุณอยู่ในเบราว์เซอร์ที่ใหม่กว่า Object.keys(obj).length == 0


1
สถานที่keysให้บริการมาจากไหน?

2
เป็นวิธีมาตรฐานใน ECMAScript 5.1
ดาวน์โหลด

1
ความคิดเห็นข้างต้นมี 4 ตัวได้อย่างไร ใช่Object.keysเป็นวิธีมาตรฐาน แต่วัตถุไม่มีคุณสมบัติคีย์ ดังนั้นรหัสนี้จะรายงานวัตถุใด ๆ ที่ว่างเปล่ายกเว้นว่ามันเกิดขึ้นโดยบังเอิญที่จะมีชื่อคุณสมบัติที่keyมีค่าซึ่งอีกครั้งเป็นคุณสมบัติที่มีชื่อlengthซึ่งไม่เป็นศูนย์ ที่น่ากลัว!
scravy

Object.keys(new Date()).length === 0; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
cjbarth

11
@scravy Object เป็นคลาสอ็อบเจ็กต์ วัตถุมีวิธีการคงที่ชื่อ 'คีย์' ซึ่งยอมรับวัตถุเป็นอาร์กิวเมนต์ วิธีการนี้จะส่งกลับอาร์เรย์ของสตริงที่สตริงเป็นชื่อทรัพย์สิน developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

34

ประสิทธิภาพ

วันนี้ 2020.01.17 ฉันทำการทดสอบบน MacOs HighSierra 10.13.6 บน Chrome v79.0, Safari v13.0.4 และ Firefox v72.0 สำหรับโซลูชันที่เลือก

สรุปผลการวิจัย

  • โซลูชั่นบนพื้นฐานของ for-in (A, J, L, M) นั้นเร็วที่สุด
  • โซลูชั่นบนพื้นฐานของ JSON.stringify (B, K) นั้นช้า
  • โซลูชันที่อิงตามObject(N) ก็น่าประหลาดใจเช่นกัน

ป้อนคำอธิบายรูปภาพที่นี่

รายละเอียด

ตัวอย่างด้านล่างในตัวอย่างจะนำเสนอโซลูชั่น 15 รายการ หากคุณต้องการที่จะเรียกใช้การทดสอบประสิทธิภาพการทำงานบนเครื่องของคุณคลิกที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


สิ่งนี้มีเหตุผลหลายอย่างที่ไม่สมเหตุสมผลเนื่องจากคุณกำลังอ้างอิงทุกสิ่งจากการคืนค่าเท็จและหรือจริง บางครั้งการเขียนโปรแกรมจำเป็นต้องมีคำสั่ง if หรือผู้ประกอบการที่ประกอบไปด้วยสามส่วน เพียงแค่ fyi
Christian Matthew

1
มันเป็นคำตอบที่ดีที่สุดขอบคุณวิธีแก้ปัญหาแรกทำงานเหมือนจับใจ
Carlos Jesus Arancibia Taborga

33

การใช้ Object.keys (obj) .length (ตามที่แนะนำข้างต้นสำหรับ ECMA 5+) ช้ากว่า 10 เท่าสำหรับวัตถุเปล่า! ใช้ตัวเลือกโรงเรียนเก่า (สำหรับ ... ใน)

ทดสอบภายใต้โหนด, Chrome, Firefox และ IE 9 จะเห็นได้ชัดว่าสำหรับกรณีส่วนใหญ่ใช้:

  • (สำหรับ ... ใน ... ) เป็นตัวเลือกที่เร็วที่สุดที่จะใช้!
  • Object.keys (obj) .length จะช้าลง 10 เท่าสำหรับวัตถุว่างเปล่า
  • JSON.stringify (obj) ความยาวจะช้าที่สุดเสมอ (ไม่น่าแปลกใจ)
  • Object.getOwnPropertyNames (obj) .length ใช้เวลานานกว่า Object.keys (obj) .lengthอาจใช้เวลานานกว่าในบางระบบ

ผลการดำเนินงานบรรทัดล่างฉลาดใช้:

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

ดูผลการทดสอบโดยละเอียดและรหัสทดสอบที่วัตถุว่างเปล่าหรือไม่


Object.keysช้า แต่รหัสน้อย ในหน้าเล็ก ๆ ที่เรียกว่า ... อาจจะ 10 ครั้ง ... มันจะยังช้ากว่านี้หากพิจารณาเวลาเพิ่มเติมในการแยกรหัสเพิ่มเติมหรือไม่
yankee

32

คุณสามารถตรวจสอบจำนวนของปุ่มวัตถุ:

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

8
ทำไมคุณต้องเพิ่มความคิดเห็นสำหรับคำตอบที่ได้รับไปแล้วและให้คำตอบที่แย่กว่านั้น? stackoverflow.com/a/32108184/4229159และเป็นคำตอบที่ 1 จากเมษายน
Alejandro Vales

ถ้าฉันมีวัตถุที่มีขนาดใหญ่มากและทำเช่นนั้นในแต่ละวงเพื่อดูว่าวัตถุนั้นว่างเปล่าหรือไม่
StefansArya

27
  1. เพียงแค่วิธีแก้ปัญหา เซิร์ฟเวอร์ของคุณสามารถสร้างคุณสมบัติพิเศษในกรณีที่ไม่มีข้อมูลได้หรือไม่?

    ตัวอย่างเช่น:

    var a = {empty:true};

    จากนั้นคุณสามารถตรวจสอบได้ในรหัสโทรกลับ AJAX ของคุณ

  2. อีกวิธีในการตรวจสอบ:

    if (a.toSource() === "({})")  // then 'a' is empty

แก้ไข : ถ้าคุณใช้ไลบรารี JSON (fe JSON.js) คุณอาจลองใช้ฟังก์ชัน JSON.encode () และทดสอบผลลัพธ์กับสตริงค่าว่าง


6
toSource()เป็นที่ไม่ได้มาตรฐานและไม่ทำงานใน IE หรือ Opera (และเบราว์เซอร์อื่น ๆ ที่อาจเกิดขึ้นผมไม่ได้ตรวจสอบ)
คริสโต

4
@Thevs: บางทีคุณอาจมีสำเนาที่แตกต่างจากรุ่นปัจจุบันของ ECMA-262 แต่ฉันไม่ได้แสดงรายการtoSourceทรัพย์สินในส่วนที่ 15.2.4; ตาม MDC มีการแนะนำใน JS1.3 (เช่น Netscape Navigator 4.06) แต่ไม่ได้อยู่ใน ECMA-262 รุ่นที่ 3!
Christoph

4
@ Thevs: อย่างน้อย 2 ผู้ขายเบราว์เซอร์ที่สำคัญไม่ได้ใช้งานดังนั้นจึงแทบจะไม่เป็นมาตรฐานจริงและเนื่องจากมันไม่ได้อยู่ใน ECMA-262 จึงไม่ใช่ของจริง ...
Christoph

4
แม้เมื่อมันไม่ทำงานtoSource()เป็นวิธีที่น่ากลัวที่จะทำนี้ (เป็นJSON.encode()) มันจำเป็นต้องสร้างสตริงที่เป็นตัวแทนวัตถุทั้งหมดของคุณเพื่อตรวจสอบว่ามันว่างเปล่าหรือไม่ มีค่าใช้จ่ายในการแปลงสิ่งต่าง ๆ เป็นสตริง แต่ยิ่งไปกว่านั้นมันจะต้องแปลงเป็นล้าน ๆ อย่างถ้าวัตถุของคุณมีคุณสมบัติเป็นล้านในขณะที่การดูเพียงอย่างเดียวจะทำให้คุณรู้ว่ามันไม่ว่างเปล่า
แจสเปอร์

4
@ พวกเขามีค่าใช้จ่ายที่ใหญ่กว่าแม้ว่ามันอาจจะเป็น (ฉันไม่แน่ใจว่ามันจะอยู่ภายใต้ทุกสถานการณ์) ในลำดับความสำคัญเดียวกัน แต่คำตอบที่เกี่ยวข้องกับการกลับเท็จทันทีที่คุณสมบัติที่แตกต่างกันพบซึ่งจะทำให้เป็นเรื่องที่แตกต่างกันทั้งหมดเข้าด้วยกัน ...
แจสเปอร์

25

ฉันได้สร้างฟังก์ชั่นที่สมบูรณ์เพื่อตรวจสอบว่าวัตถุว่างเปล่าหรือไม่

ใช้Object.keysจากฟังก์ชัน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พร้อมการสาธิตและการทดสอบอย่างง่าย

ฉันหวังว่ามันจะช่วยให้ใครบางคน ไชโย!


3
สิ่งนี้ล้มเหลวสำหรับnullวัตถุ

สวัสดี @torazaburo! ขอขอบคุณที่แจ้งให้ทราบ! ฉันได้อัปเดตแหล่งที่มาทั้งหมดด้วยการใช้งานที่ถูกต้อง
Slava Fomin II

1
ความยาว Object.keys ({}) นั้นช้ากว่าตัวเลือก (สำหรับ ... ใน ... ) 10 เท่า - ฉันแนะนำให้หลีกเลี่ยงเป็นวิธีทดสอบว่า objetc ว่างเปล่าหรือไม่
davidhadas

1
Object.keys(new Date()).length === 0; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
cjbarth

19

ฉันใช้สิ่งนี้

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;

จากที่นี่

ปรับปรุง

หรือ

คุณสามารถใช้การดำเนินการ jQuery ของ isEmptyObject

function isEmptyObject(obj) {
  var name;
  for (name in obj) {
    return false;
  }
  return true;
}

สวัสดี เมื่อคุณทดสอบฟังก์ชั่นนี้ด้วยตัวเลขหรือบูลีน true หรือ false return true และนี่ไม่ใช่ผลลัพธ์ที่ถูกต้อง isObjectEmpty (จริง) isObjectEmpty (เท็จ) isObjectEmpty (1)
iman

2
เรากำลังตรวจสอบว่าวัตถุว่างเปล่าหรือไม่ถ้าประเภทข้อมูลเป็นวัตถุ ในกรณีของคุณเพื่อตรวจสอบว่ามันเป็นวัตถุที่เราต้องการอะไรเช่น (typeof a === "object") {... }
kiranvj

15

ตัวอย่างต่อไปนี้แสดงวิธีทดสอบว่าวัตถุ 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


15

ตามข้อกำหนดES2017ในObject.entries ()การตรวจสอบนั้นง่ายโดยใช้เบราว์เซอร์ที่ทันสมัย ​​-

Object.entries({}).length === 0

3
มีประโยชน์ในการใช้มากกว่านี้Object.keysหรือObject.valuesไม่?
faintsignal

@fignignal ใช้พวกนั้นดีอย่างสมบูรณ์ ฉันเพิ่งเพิ่มรายการเนื่องจากไม่พบในความคิดเห็น
Vikrant

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

4
สิ่งนั้นจะรายงานเช่นเดียวกันเมื่อไลบรารี JavaScript ขยายObjectด้วยเมธอดผ่านลูกโซ่ต้นแบบเนื่องจากนั้นนับได้และfor inคำสั่งจะวนซ้ำผ่านคุณสมบัติที่นับได้
viam0Zah

12

jQuery มีฟังก์ชั่นพิเศษisEmptyObject()สำหรับกรณีนี้:

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

อ่านเพิ่มเติมได้ที่http://api.jquery.com/jQuery.isEmptyObject/


12

ฉันจะไปตรวจสอบว่ามันมีอย่างน้อยหนึ่งคีย์ นั่นพอเพียงที่จะบอกฉันว่ามันไม่ว่างเปล่า

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])

1
เกิดอะไรขึ้นถ้าคีย์แรกคืนfalseค่า ผลลัพธ์จะfalseไม่ถูกต้อง
Jimmy Obonyo Abor

ฉันได้ทำการทดสอบแล้ว คุณสามารถยกตัวอย่างการทำงานได้หรือไม่?
ทิวดอร์มอร์ร์

1
นี้สั้นและรัดกุม แต่จะส่งผลให้เกิดข้อผิดพลาดรันไทม์ถ้าวัตถุไม่ได้กำหนด
Mrinmoy

11

ภายใต้ประทุนทุกวิธีการตรวจสอบที่ว่างเปล่าในห้องสมุดทั้งหมดใช้ปุ่มวัตถุการตรวจสอบตรรกะ มันเป็นวิธีที่แปลกที่จะทำให้เข้าใจซึ่งคุณสามารถใส่ในวิธีการอธิบายที่นี่

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

ในขณะที่ถูกต้องเป็นวิธีแปลก ๆ ในการสร้างคำสั่ง if - มันอาจจะทำให้คนที่สับสนจะดูแลรหัสหลังจากคุณ
Soren

10


คุณสามารถใช้รหัสง่ายๆนี้ที่ไม่ได้ใช้jQueryหรือไลบรารีอื่น ๆ

var a=({});

//check is an empty object
if(JSON.stringify(a)=='{}') {
    alert('it is empty');
} else {
    alert('it is not empty');
}

JSONชั้นเรียนและฟังก์ชั่นของมัน ( แยกและstringify ) จะมีประโยชน์มาก แต่มีปัญหาบางอย่างกับ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

JSON.stringifyวิธีการแก้ปัญหาล้มเหลวหากวัตถุมีคุณสมบัติที่ไม่สามารถตรวจสอบได้เช่นฟังก์ชั่นหรือ "undefined" แม้ว่าจะได้รับเป็นกรณีขอบ

10

วิธีที่ดีที่สุดที่ฉันพบ:

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

3
ฉันจะบอกว่า 0 ไม่ว่างเปล่าเพราะมันเป็นจำนวนจริง ทุกอย่างดูดี แต่การแก้ไขนั้นง่าย ในครั้งแรกถ้าคำสั่งเพิ่มนี้ if (!obj && obj !== 0).
mjwrazor

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

เพียงแค่ฉันไม่คิดว่าเบราว์เซอร์ทั้งหมดจะใช้งานObject.keys()ในปัจจุบัน


2
Object.keys(new Date()).length === 0; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
cjbarth

3
ขึ้นอยู่กับว่าคุณพิจารณาวันที่ที่จะ "เต็ม" เสมอแม้ว่าจะไม่เปิดเผยคีย์ก็ตาม แต่ฉันยอมรับว่าถ้าเป็นแผนของคุณการเพิ่มอินสแตนซ์เสริมบางอย่างของการตรวจสอบตัวสร้างวันที่เป็นตัวเลือกที่ดี
NiKo

9

หาก jQuery และเว็บเบราว์เซอร์ไม่พร้อมใช้งานนอกจากนี้ยังมีฟังก์ชั่น isEmpty ใน underscore.js

_.isEmpty({}) // returns true

นอกจากนี้จะไม่ถือว่าพารามิเตอร์อินพุตเป็นวัตถุ สำหรับรายการหรือสตริงหรือไม่ได้กำหนดก็จะเปิดคำตอบที่ถูกต้อง


ขีดเส้นใต้ได้รับการกล่าวถึงแล้วในคำตอบไม่กี่ปีก่อนหน้านี้
Dan Dascalescu

7

ข้อแม้! ระวังการ จำกัด 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)

    ผลตอบแทน

    {}

7

คำตอบที่ถูกต้องคือ:

const isEmptyObject = obj =>
  Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype;

ตรวจสอบว่า:

  • วัตถุไม่มีคุณสมบัติของตัวเอง (ไม่ว่าจะนับจำนวนเท่าใด)
  • วัตถุไม่มีสัญลักษณ์คุณสมบัติของตัวเอง
  • Object.prototypeต้นแบบของวัตถุเป็นสิ่ง

ในคำอื่น ๆ {}วัตถุที่แยกไม่ออกจากที่หนึ่งที่สร้างขึ้นด้วย


6

นอกเหนือจากคำตอบ Thevs:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

It's jquery + jquery.json


ฉันไม่ชอบใช้ JSON เพราะไม่สามารถทำงานกับโครงสร้างวัตถุแบบวงกลมได้
itdoesntwork

2
หากหน้าเว็บของคุณโหลด jQuery ให้ใช้$.isEmptyObject()อย่าเสียวงจรกับการแปลงที่ไม่ชัดเจน
skierpage

6

Sugar.JSให้วัตถุเพิ่มเติมสำหรับวัตถุประสงค์นี้ รหัสสะอาดและเรียบง่าย:

ทำให้วัตถุขยาย:

a = Object.extended({})

ตรวจสอบขนาดของมัน:

a.size()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.