หลังจากคำขอ AJAX บางครั้งแอปพลิเคชันของฉันอาจส่งคืนวัตถุว่างเปล่าเช่น:
var a = {};
ฉันจะตรวจสอบว่าเป็นอย่างนั้นได้อย่างไร
if( Object.entries(a).length > 0){ //do }
หลังจากคำขอ AJAX บางครั้งแอปพลิเคชันของฉันอาจส่งคืนวัตถุว่างเปล่าเช่น:
var a = {};
ฉันจะตรวจสอบว่าเป็นอย่างนั้นได้อย่างไร
if( Object.entries(a).length > 0){ //do }
คำตอบ:
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.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
Object.keys(new Date()).length === 0
; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
(new Date()).constructor === Date
({}).constructor === Object
Object.keys()
ไม่ตรวจสอบคุณสมบัติหรือสัญลักษณ์ที่ไม่สามารถนับได้ คุณต้องใช้Object.getOwnPropertyNames()
และObject.getOwnPropertySymbols()
แทน นอกจากนี้ยังObject.getPrototypeOf()
เป็นวิธีที่ถูกต้องในการรับต้นแบบของวัตถุ obj.constructor
สามารถปลอมแปลงได้ง่าย ตัวอย่าง: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // 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;
}
isEmpty()
ดังนั้นจึงควรส่งคืนfalse
ถ้ามีคุณสมบัติ
underscore.js
...
นี่คือทางออกที่ฉันต้องการ:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Object.keys(new Date()).length === 0
; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
new Date()
ไม่ใช่วัตถุ ผลในการnd = new Date(); nd.constructor === Object;
false
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
ดูhttp://bencollier.net/2011/04/javascript-is-an-object-empty/
Object.getOwnPropertyNames(new Date()).length === 0
; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
วิธีการเกี่ยวกับการใช้ JSON.stringify มันเกือบจะมีอยู่ในเบราว์เซอร์ที่ทันสมัยทั้งหมด
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
ฉันเพิ่งเจอสถานการณ์ที่คล้ายกัน ฉันไม่ต้องการใช้ JQuery และต้องการทำสิ่งนี้โดยใช้ Javascript แท้ๆ
และสิ่งที่ฉันทำคือใช้เงื่อนไขต่อไปนี้และมันก็ได้ผลสำหรับฉัน
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
เพื่อไม่เท่ากับใช้สิ่งนี้: JSON.stringify(obj) !== '{}'
ตรวจสอบJSFiddleนี้
คำถามเก่า แต่เพิ่งมีปัญหา การรวม JQuery ไม่ใช่ความคิดที่ดีหากวัตถุประสงค์เพียงอย่างเดียวของคุณคือการตรวจสอบว่าวัตถุนั้นไม่ว่างเปล่าหรือไม่ ให้ลึกเข้าไปในโค้ดของ JQueryและคุณจะได้คำตอบ:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
มีวิธีง่าย ๆ ถ้าคุณอยู่ในเบราว์เซอร์ที่ใหม่กว่า
Object.keys(obj).length == 0
Object.keys
เป็นวิธีมาตรฐาน แต่วัตถุไม่มีคุณสมบัติคีย์ ดังนั้นรหัสนี้จะรายงานวัตถุใด ๆ ที่ว่างเปล่ายกเว้นว่ามันเกิดขึ้นโดยบังเอิญที่จะมีชื่อคุณสมบัติที่key
มีค่าซึ่งอีกครั้งเป็นคุณสมบัติที่มีชื่อlength
ซึ่งไม่เป็นศูนย์ ที่น่ากลัว!
Object.keys(new Date()).length === 0
; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
วันนี้ 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 รายการ หากคุณต้องการที่จะเรียกใช้การทดสอบประสิทธิภาพการทำงานบนเครื่องของคุณคลิกที่นี่
การใช้ Object.keys (obj) .length (ตามที่แนะนำข้างต้นสำหรับ ECMA 5+) ช้ากว่า 10 เท่าสำหรับวัตถุเปล่า! ใช้ตัวเลือกโรงเรียนเก่า (สำหรับ ... ใน)
ทดสอบภายใต้โหนด, Chrome, Firefox และ IE 9 จะเห็นได้ชัดว่าสำหรับกรณีส่วนใหญ่ใช้:
ผลการดำเนินงานบรรทัดล่างฉลาดใช้:
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 ครั้ง ... มันจะยังช้ากว่านี้หากพิจารณาเวลาเพิ่มเติมในการแยกรหัสเพิ่มเติมหรือไม่
คุณสามารถตรวจสอบจำนวนของปุ่มวัตถุ:
if (Object.keys(a).length > 0) {
// not empty
}
เพียงแค่วิธีแก้ปัญหา เซิร์ฟเวอร์ของคุณสามารถสร้างคุณสมบัติพิเศษในกรณีที่ไม่มีข้อมูลได้หรือไม่?
ตัวอย่างเช่น:
var a = {empty:true};
จากนั้นคุณสามารถตรวจสอบได้ในรหัสโทรกลับ AJAX ของคุณ
อีกวิธีในการตรวจสอบ:
if (a.toSource() === "({})") // then 'a' is empty
แก้ไข : ถ้าคุณใช้ไลบรารี JSON (fe JSON.js) คุณอาจลองใช้ฟังก์ชัน JSON.encode () และทดสอบผลลัพธ์กับสตริงค่าว่าง
toSource()
เป็นที่ไม่ได้มาตรฐานและไม่ทำงานใน IE หรือ Opera (และเบราว์เซอร์อื่น ๆ ที่อาจเกิดขึ้นผมไม่ได้ตรวจสอบ)
toSource
ทรัพย์สินในส่วนที่ 15.2.4; ตาม MDC มีการแนะนำใน JS1.3 (เช่น Netscape Navigator 4.06) แต่ไม่ได้อยู่ใน ECMA-262 รุ่นที่ 3!
toSource()
เป็นวิธีที่น่ากลัวที่จะทำนี้ (เป็นJSON.encode()
) มันจำเป็นต้องสร้างสตริงที่เป็นตัวแทนวัตถุทั้งหมดของคุณเพื่อตรวจสอบว่ามันว่างเปล่าหรือไม่ มีค่าใช้จ่ายในการแปลงสิ่งต่าง ๆ เป็นสตริง แต่ยิ่งไปกว่านั้นมันจะต้องแปลงเป็นล้าน ๆ อย่างถ้าวัตถุของคุณมีคุณสมบัติเป็นล้านในขณะที่การดูเพียงอย่างเดียวจะทำให้คุณรู้ว่ามันไม่ว่างเปล่า
ฉันได้สร้างฟังก์ชั่นที่สมบูรณ์เพื่อตรวจสอบว่าวัตถุว่างเปล่าหรือไม่
ใช้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พร้อมการสาธิตและการทดสอบอย่างง่าย
ฉันหวังว่ามันจะช่วยให้ใครบางคน ไชโย!
Object.keys(new Date()).length === 0
; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
ฉันใช้สิ่งนี้
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;
}
ตัวอย่างต่อไปนี้แสดงวิธีทดสอบว่าวัตถุ 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
ตามข้อกำหนดES2017ในObject.entries ()การตรวจสอบนั้นง่ายโดยใช้เบราว์เซอร์ที่ทันสมัย -
Object.entries({}).length === 0
Object.keys
หรือObject.values
ไม่?
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
Object
ด้วยเมธอดผ่านลูกโซ่ต้นแบบเนื่องจากนั้นนับได้และfor in
คำสั่งจะวนซ้ำผ่านคุณสมบัติที่นับได้
jQuery มีฟังก์ชั่นพิเศษisEmptyObject()
สำหรับกรณีนี้:
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
อ่านเพิ่มเติมได้ที่http://api.jquery.com/jQuery.isEmptyObject/
ฉันจะไปตรวจสอบว่ามันมีอย่างน้อยหนึ่งคีย์ นั่นพอเพียงที่จะบอกฉันว่ามันไม่ว่างเปล่า
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
false
ค่า ผลลัพธ์จะfalse
ไม่ถูกต้อง
ภายใต้ประทุนทุกวิธีการตรวจสอบที่ว่างเปล่าในห้องสมุดทั้งหมดใช้ปุ่มวัตถุการตรวจสอบตรรกะ มันเป็นวิธีที่แปลกที่จะทำให้เข้าใจซึ่งคุณสามารถใส่ในวิธีการอธิบายที่นี่
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
คุณสามารถใช้รหัสง่ายๆนี้ที่ไม่ได้ใช้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
วิธีที่ดีที่สุดที่ฉันพบ:
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 (!obj && obj !== 0)
.
สิ่งที่ฉันใช้:
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()
ในปัจจุบัน
Object.keys(new Date()).length === 0
; ดังนั้นคำตอบนี้อาจทำให้เข้าใจผิด
หาก jQuery และเว็บเบราว์เซอร์ไม่พร้อมใช้งานนอกจากนี้ยังมีฟังก์ชั่น isEmpty ใน underscore.js
_.isEmpty({}) // returns true
นอกจากนี้จะไม่ถือว่าพารามิเตอร์อินพุตเป็นวัตถุ สำหรับรายการหรือสตริงหรือไม่ได้กำหนดก็จะเปิดคำตอบที่ถูกต้อง
ข้อแม้! ระวังการ จำกัด 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) ผลตอบแทน {}
คำตอบที่ถูกต้องคือ:
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
ตรวจสอบว่า:
Object.prototype
ต้นแบบของวัตถุเป็นสิ่งในคำอื่น ๆ {}
วัตถุที่แยกไม่ออกจากที่หนึ่งที่สร้างขึ้นด้วย
นอกเหนือจากคำตอบ Thevs:
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
It's jquery + jquery.json
$.isEmptyObject()
อย่าเสียวงจรกับการแปลงที่ไม่ชัดเจน
Sugar.JSให้วัตถุเพิ่มเติมสำหรับวัตถุประสงค์นี้ รหัสสะอาดและเรียบง่าย:
ทำให้วัตถุขยาย:
a = Object.extended({})
ตรวจสอบขนาดของมัน:
a.size()