javascript - मैं एक खाली जावास्क्रिप्ट ऑब्जेक्ट के लिए कैसे परीक्षण करूं?




json (25)

AJAX अनुरोध के बाद, कभी-कभी मेरा एप्लिकेशन एक खाली ऑब्जेक्ट वापस कर सकता है, जैसे:

var a = {};

मैं कैसे जांच सकता हूं कि यह मामला है या नहीं?


Answers

मैंने पाया सबसे अच्छा तरीका:

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

मैं इसका उपयोग कर रहा हूँ।

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

चेतावनी! 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 ) );

प्रदर्शित करता है

    Beware!! obj is NOT empty!

    obj = {  f:function(){}  }

    JSON.stringify( obj )

    returns

    {}

मैं बस एक समान स्थिति में भाग गया। मैं JQuery का उपयोग नहीं करना चाहता था, और शुद्ध जावास्क्रिप्ट का उपयोग करके ऐसा करना चाहता था।

और मैंने जो किया वह निम्नलिखित शर्त का उपयोग करता था, और यह मेरे लिए काम करता था।

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

इसके बराबर नहीं, इसका उपयोग करें: JSON.stringify(obj) !== '{}'

इस JSFiddle


एक अन्य विकल्प है is.js (32kb), lodash (50kB), या underscore (16.4 केबी) के विपरीत is.js (14kb) का उपयोग करना है। is.js उपरोक्त पुस्तकालयों के बीच सबसे तेज़ लाइब्रेरी साबित हुआ है जिसका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि कोई ऑब्जेक्ट खाली है या नहीं।

http://jsperf.com/check-empty-object-using-libraries

जाहिर है, ये सभी पुस्तकालय बिल्कुल समान नहीं हैं, इसलिए यदि आपको आसानी से डीओएम में हेरफेर करने की आवश्यकता है तो jquery अभी भी एक अच्छी पसंद हो सकती है या यदि आपको केवल जांच प्रकार से अधिक की आवश्यकता है तो lodash या underscore अच्छा हो सकता है। is.js , यहां वाक्यविन्यास है:

var a = {};
is.empty(a); // true
is.empty({"hello": "world"}) // false

अंडरस्कोर और लॉनाश की _.isObject() , यह विशेष रूप से objects लिए नहीं है बल्कि arrays और strings पर भी लागू होता है।

हुड के तहत यह लाइब्रेरी Object.getOwnPropertyNames का उपयोग कर Object.getOwnPropertyNames जो Object.getOwnPropertyNames समान है लेकिन Object.getOwnPropertyNames एक और गहन है क्योंकि यह here वर्णित 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 === '';
    }
};

यदि आप एक पुस्तकालय (जो समझ में आता है) लाने के लिए नहीं चाहते हैं और आप जानते हैं कि आप केवल वस्तुओं की जांच कर रहे हैं (सरणी या स्ट्रिंग नहीं) तो निम्न कार्य आपकी आवश्यकताओं के अनुरूप होना चाहिए।

function isEmptyObject( obj ) {
    return Object.getOwnPropertyNames(obj).length === 0;
}

यह is.js की तुलना में केवल थोड़ा तेज़ है हालांकि सिर्फ इसलिए कि आप यह जांच नहीं रहे हैं कि यह एक वस्तु है या नहीं।


ऐसा करने का कोई आसान तरीका नहीं है। आपको गुणों पर स्पष्ट रूप से लूप करना होगा:

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

एक और सरल, शुद्ध जेएस रास्ता :)

if (JSON.stringify(pathParams) === '{}')


मैं जांच करूँगा कि इसमें कम से कम एक कुंजी है या नहीं। यह मुझे बताने के लिए पर्याप्त होगा कि यह खाली नहीं है।

Boolean(Object.keys(obj)[0])

मैंने यह निर्धारित करने के लिए एक पूर्ण कार्य बनाया है कि ऑब्जेक्ट खाली है या नहीं।

यह सर्वोत्तम प्रदर्शन ( संगतता तालिका देखें) और पुराने इंजन (ब्राउज़र्स) के लिए सबसे संगत दृष्टिकोण पर फ़ॉलबैक प्राप्त करने के लिए संभव होने पर ECMAScript 5 ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) कार्यक्षमता से developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… का उपयोग करता है।

उपाय

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

इस कोड के लिए यहां Gist

और यहां JSFiddle प्रदर्शन और एक सरल परीक्षण के साथ है।

मुझे उम्मीद है कि यह किसी की मदद करेगा। चीयर्स!


Thevs उत्तर के अलावा:

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

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

यह jquery + jquery.json है


एक साधारण पाश:

var is_empty = true;
for(var i in obj) {
    is_empty = false;
    break;
}

आप ऑब्जेक्ट कुंजी की गिनती की जांच कर सकते हैं:

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

  1. बस एक कामकाज। क्या कोई सर्वर डेटा के मामले में कुछ विशेष संपत्ति उत्पन्न कर सकता है?

    उदाहरण के लिए:

    var a = {empty:true};

    फिर आप इसे अपने AJAX कॉलबैक कोड में आसानी से देख सकते हैं।

  2. इसे जांचने का एक और तरीका:

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

संपादित करें : यदि आप किसी भी JSON लाइब्रेरी (fe JSON.js) का उपयोग करते हैं तो आप JSON.encode () फ़ंक्शन का प्रयास कर सकते हैं और खाली मान स्ट्रिंग के विरुद्ध परिणाम का परीक्षण कर सकते हैं।


ऑब्जेक्ट.कीज (ओबीजे)। लम्बाई (जैसा ईसीएमए 5+ के लिए ऊपर सुझाया गया है) का उपयोग खाली वस्तुओं के लिए 10 गुना धीमा है! पुराने स्कूल (के लिए ... में) विकल्प के साथ रखें।

नोड, क्रोम, फ़ायरफ़ॉक्स और आईई 9 के तहत परीक्षण किया गया, यह स्पष्ट हो जाता है कि ज्यादातर उपयोग मामलों के लिए:

  • (के लिए ... में ...) उपयोग करने का सबसे तेज़ विकल्प है!
  • ऑब्जेक्ट.कीज (ओबीजे)। लम्बाई खाली वस्तुओं के लिए 10 गुना धीमी है
  • JSON.stringify (obj)। लम्बाई हमेशा सबसे धीमी है (आश्चर्यजनक नहीं)
  • Object.getOwnPropertyNames (obj)। लम्बाई ऑब्जेक्ट.की (ओबीजे) से अधिक समय लेता है । कुछ प्रणालियों पर लम्बाई अधिक लंबा हो सकता है।

नीचे पंक्ति प्रदर्शन के अनुसार, उपयोग करें:

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

ऑब्जेक्ट खाली पर विस्तृत परीक्षण परिणाम और परीक्षण कोड देखें ?


निम्न उदाहरण दिखाता है कि जावास्क्रिप्ट ऑब्जेक्ट खाली है या नहीं, अगर खाली हो तो इसका मतलब है कि इसका कोई गुण नहीं है।

लिपि ईएस 6 पर काम करता है।

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


इस मामले के लिए jQuery में विशेष कार्य है isEmptyObject() :

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

jQuery पर और पढ़ें


JSON.stringify का उपयोग करने के बारे में कैसे? यह लगभग सभी आधुनिक ब्राउज़रों में उपलब्ध है।

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

यदि आप एक नए ब्राउज़र पर हैं तो एक आसान तरीका है। Object.keys(obj).length == 0


आप में से उन लोगों के लिए जिनके पास एक ही समस्या है लेकिन jQuery का उपयोग करता है, आप jQuery उपयोग कर सकते हैं।


ईसीएमए 5+ :

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

प्री-ईसीएमए 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

Underscore :

_.isEmpty({}); // true

Hoek

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

ExtJS

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

AngularJS (संस्करण 1)

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

Ramda

R.isEmpty({}); // true

सही जवाब है:

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

यह जांचता है कि:

  • ऑब्जेक्ट की कोई गुण नहीं है (गणना की परवाह किए बिना)।
  • वस्तु का कोई संपत्ति गुण नहीं है।
  • ऑब्जेक्ट का प्रोटोटाइप बिल्कुल Object.prototype

दूसरे शब्दों में, ऑब्जेक्ट {} के साथ बनाए गए एक से अलग है।


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


पुराना सवाल, लेकिन सिर्फ मुद्दा था। JQuery सहित वास्तव में एक अच्छा विचार नहीं है यदि आपका एकमात्र उद्देश्य यह जांचना है कि ऑब्जेक्ट खाली नहीं है या नहीं। इसके बजाय, JQuery के कोड में बस गहरा है, और आपको जवाब मिल जाएगा:

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

आप ES6 का उपयोग कर सकते हैं।

var array=['1','2','3','4','5','6']
var index = array.filter((value)=>value!='3');

आउटपुट:

["1", "2", "4", "5", "6"]




javascript json