javascript - شرح - string to json java




كيف يمكنني اختبار كائن JavaScript فارغ؟ (20)

بعد طلب AJAX ، قد يعرض طلبي أحيانًا كائنًا خاليًا ، مثل:

var a = {};

كيف يمكنني التحقق مما إذا كان هذا هو الحال؟


  1. مجرد حل. هل يمكن لخادمك توليد بعض الممتلكات الخاصة في حالة عدم وجود بيانات؟

    فمثلا:

    var a = {empty:true};
    

    ثم يمكنك التحقق من ذلك بسهولة في رمز رد الاتصال AJAX.

  2. طريقة أخرى للتحقق من ذلك:

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

EDIT : إذا كنت تستخدم أي مكتبة JSON (fe JSON.js) ، فيمكنك محاولة استخدام JSON.encode () واختبار النتيجة مقابل سلسلة القيمة الفارغة.


jQuery لها وظيفة خاصة هي isEmptyObject() لهذه الحالة:

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

قراءة المزيد على jQuery


أنا أستخدم هذا.

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

أنا فقط ركضت في وضع مماثل. لم أكن أرغب في استخدام JQuery ، وأردت القيام بذلك باستخدام جافا سكريبت خالص.

وما فعلته هو ، استخدم الشرط التالي ، وعمل لي.

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 (كما هو موضح أعلاه لـ ECMA 5+) هو 10 مرات أبطأ للأجسام الفارغة! الحفاظ على خيار المدرسة القديمة (في ...).

تم اختباره تحت العقدة و Chrom و Firefox و IE 9 ، يصبح من الواضح أنه بالنسبة لمعظم حالات الاستخدام:

  • (ل ... في ...) هو أسرع خيار للاستخدام!
  • Object.keys (obj) .length هو 10 مرات أبطأ للكائنات الفارغة
  • JSON.stringify (obj) .length دائمًا هو الأبطأ (وليس مفاجئًا)
  • يستغرق Object.getOwnPropertyNames (obj) .length وقتًا أطول من Object.keys (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;
}

انظر نتائج الاختبار التفصيلية ورمز الاختبار في كائن فارغ؟


بديل آخر هو استخدام is.js (14kB) مقابل jquery (32kB) ، lodash (50kB) ، أو الشرطة underscore (16.4 كيلو بايت). ثبت أن is.js هو أسرع مكتبة بين المكتبات سالفة الذكر التي يمكن استخدامها لتحديد ما إذا كان الكائن فارغًا.

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

من الواضح أن جميع هذه المكتبات ليست متماثلة تمامًا ، لذلك إذا كنت بحاجة إلى التعامل مع DOM بسهولة ، فربما لا يزال jquery خيارًا جيدًا أو إذا كنت بحاجة إلى أكثر من مجرد كتابة ، فقد يكون الأمر جيدًا. بالنسبة إلى is.js ، إليك الصيغة التالية:

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

مثل _.isObject() الشرطة السفلية و lodash ، هذا ليس حصرا objects ولكن ينطبق أيضا على arrays strings .

تحت غطاء محرك Object.getOwnPropertyNames هذه المكتبة تستخدم Object.getOwnPropertyNames يشبه Object.keys لكن Object.getOwnPropertyNames هو أكثر شمولا لأنه سيعود الخصائص التي لا حصر لها وغير قابلة للتعداد كما هو موضح here .

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 فقط لأنك لا تتحقق من كونه كائنًا.


حلقة بسيطة:

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

طريقة أخرى بسيطة ، نقية JS :)

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


كنت أذهب للتحقق إذا كان لديه مفتاح واحد على الأقل. سيكفي أن تخبرني أنها ليست فارغة.

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

لقد قمت بإنشاء وظيفة كاملة لتحديد ما إذا كان الكائن فارغًا.

ويستخدم developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… من developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 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;
    }
}

هنا هو Gist هذا الرمز.

وهنا JSFiddle مع مظاهرة واختبار بسيط.

آمل أن يساعد شخص ما. في صحتك!


ليس هناك طريقة سهلة للقيام بذلك. سيكون عليك أن تتكرر على الخصائص بشكل صريح:

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

مذكرة قانونية! حذار من حدود 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

    {}

هذا هو الحل المفضل لدي:

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

والجواب الصحيح هو:

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

هذا يتحقق من أن:

  • الكائن ليس له خصائصه الخاصة (بصرف النظر عن العدد).
  • لا يحتوي الكائن على رموز خاصية خاصة.
  • النموذج الأولي للكائن هو Object.prototype تمامًا.

بمعنى آخر ، لا يمكن تمييز الكائن عن كائن تم إنشاؤه باستخدام {} .


يمكنك استخدام Underscore .

_.isEmpty({}); // true

يوضح المثال التالي كيفية اختبار ما إذا كان كائن جافا سكريبت فارغًا ، إذا كان فارغًا يعني أنه ليس له خصائص خاصة به.

يعمل البرنامج النصي على 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


يوفر Sugar.JS كائنات موسعة لهذا الغرض. الرمز نظيف وبسيط:

جعل كائن الموسعة:

a = Object.extended({})

تحقق من حجمها:

a.size()


يمكنك استخدام هذا الرمز البسيط الذي لم يستخدم jQuery أو مكتبات أخرى

var a=({});

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

تعتبر فئة JSON ووظائفها ( تحليل وتسلسل ) مفيدة جدًا ، ولكنها تواجه بعض المشكلات في IE7 ويمكنك إصلاحها باستخدام هذا الكود البسيط http://www.json.org/js.html .

طريقة بسيطة أخرى (أبسط طريقة):
يمكنك استخدام هذه الطريقة بدون استخدام jQuery أو JSON object.

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) {
  for(var i in obj) { return false; }
  return true;
}




json