javascript - করব - মুমিনের পরীক্ষা




কিভাবে আমি একটি খালি জাভাস্ক্রিপ্ট বস্তুর জন্য পরীক্ষা করবেন? (20)

একটি AJAX অনুরোধের পরে, কখনও কখনও আমার অ্যাপ্লিকেশন একটি খালি বস্তু ফেরত দিতে পারে, যেমন:

var a = {};

আমি কিভাবে যে মামলা চেক করতে পারেন?


  1. শুধু একটি workaround। আপনার সার্ভার কোন তথ্য ক্ষেত্রে কিছু বিশেষ সম্পত্তি উৎপন্ন করতে পারেন?

    উদাহরণ স্বরূপ:

    var a = {empty:true};

    তারপর আপনি সহজেই এটি আপনার AJAX কলব্যাক কোডে চেক করতে পারেন।

  2. এটি পরীক্ষা করার আরেকটি উপায়:

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

সম্পাদনা করুন : যদি আপনি কোনও JSON লাইব্রেরি (fe JSON.js) ব্যবহার করেন তবে আপনি JSON.encode () ফাংশনটি চেষ্টা করতে পারেন এবং ফাঁকা মান স্ট্রিংয়ের বিরুদ্ধে ফলাফল পরীক্ষা করতে পারেন।


Object.keys (obj)। লম্বা (ECMA 5+ এর জন্য উপরের প্রস্তাবিত) ব্যবহার করে খালি বস্তুর জন্য 10 বার ধীর! পুরাতন স্কুল (জন্য ...) বিকল্প সঙ্গে রাখা।

নোড, ক্রোম, ফায়ারফক্স এবং IE 9 এর অধীনে পরীক্ষিত, এটি প্রমাণিত হয় যে বেশিরভাগ ক্ষেত্রেই:

  • (জন্য ... মধ্যে ...) ব্যবহার করার জন্য দ্রুততম বিকল্প!
  • Object.keys (obj)। দৈর্ঘ্য খালি বস্তুর জন্য 10 গুণ ধীর
  • JSON.stringify (obj)। দৈর্ঘ্য সর্বদা ধীরতম (না suprising)
  • Object.getOwnPropertyNames (obj)। দৈর্ঘ্য 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;
}

বিস্তারিত পরীক্ষা ফলাফল এবং পরীক্ষা কোড বস্তু খালি দেখুন?


আপনার জন্য যারা একই সমস্যা আছে কিন্তু jQuery ব্যবহার করে, আপনি jQuery ব্যবহার করতে পারেন।


আপনি Underscore ব্যবহার করতে পারেন।

_.isEmpty({}); // true

আপনি একটি নতুন ব্রাউজারে যদি একটি সহজ উপায় আছে। Object.keys(obj).length == 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() প্রয়োগ করে।


আমি এই ব্যবহার করছি।

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

আমি খুঁজে পেয়েছি যে ভাল উপায়:

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

আরেকটি বিকল্প is.js (14kb) ব্যবহার করা হয় যেমন jquery (32kb), lodash (50kb), বা underscore (16.4kB)। is.js পূর্ববর্তী গ্রন্থাগারগুলির মধ্যে দ্রুততম লাইব্রেরি হিসাবে প্রমাণিত হয়েছে যা কোন বস্তু খালি কিনা তা নির্ধারণ করতে ব্যবহার করা যেতে পারে।

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

স্পষ্টতই এই সমস্ত লাইব্রেরিগুলি একই রকম নয় যাতে আপনাকে সহজেই DOM ম্যানিপুলেশন করতে হয় তবে lodash এখনও ভাল পছন্দ হতে পারে অথবা যদি কেবলমাত্র চেকিংয়ের চেয়ে বেশি প্রয়োজন হয় তবে 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 এটি আরও পুঙ্খানুপুঙ্খভাবে রয়েছে কারণ এটি বর্ণিত হিসাবে অসংখ্য এবং অ-সংখ্যাসূচক বৈশিষ্ট্যগুলি ফেরত দেবে।

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 a = {}; //if empty returns false
(Object.getOwnPropertyNames != undefined ? Object.getOwnPropertyNames(a).length != 0 : (function(){for(var key in a) break; return (key != null) && (key != undefined);})()) //Returns False

var a = {b:2} //if not empty returns true
(Object.getOwnPropertyNames != undefined ? Object.getOwnPropertyNames(a).length != 0 : (function(){for(var key in a) break; return (key != null) && (key != undefined);})()) //Returns true

ইসিএমএ -5অবজেক্ট.getOwnPropertyNames প্রয়োগ করা হয়েছে। উপরোক্ত লাইন একটি fallback ফাংশন সঙ্গে পুরানো ব্রাউজারে কাজ করে।

JSFiddler


এটি আমার পছন্দসই সমাধান:

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

কিভাবে JSON.stringify ব্যবহার সম্পর্কে? এটি প্রায় সব আধুনিক ব্রাউজারে উপলব্ধ।

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

নিম্নোক্ত উদাহরণটি দেখায় কিভাবে একটি জাভাস্ক্রিপ্ট অবজেক্ট খালি হয় তা পরীক্ষা করে দেখানো হয়, যদি খালি হয়ে থাকে তবে তার মানে আমাদের কোনও বৈশিষ্ট্য নেই।

স্ক্রিপ্ট 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


পুরানো প্রশ্ন, কিন্তু শুধু সমস্যা ছিল। বস্তুটি খালি না থাকলে পরীক্ষা করা আপনার একমাত্র উদ্দেশ্য যদি JQuery সহ সত্যিই একটি ভাল ধারণা না। পরিবর্তে, JQuery এর কোডের মধ্যে গভীর, এবং আপনি উত্তর পাবেন:

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

যদি জাভাস্ক্রিপ্ট এবং ওয়েব ব্রাউজারটি পাওয়া না যায় তবে underscore.js এ একটি ইক্ষিন ফাংশন রয়েছে।

_.isEmpty({}) // returns true

উপরন্তু, এটি একটি বস্তু হতে ইনপুট পরামিতি অনুমান করা হয় না। একটি তালিকা বা স্ট্রিং বা অনির্ধারিত জন্য, এটি সঠিক উত্তর চালু হবে।


সঠিক উত্তর হল:

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

এই চেক করে যে:

  • বস্তুর কোন নিজস্ব বৈশিষ্ট্য আছে (নির্বিশেষে নির্বিশেষে)।
  • বস্তুর কোন নিজস্ব সম্পত্তি প্রতীক আছে।
  • বস্তুর প্রোটোটাইপ ঠিক বস্তু। প্রোটোটাইপ।

অন্য কথায়, বস্তু {} দিয়ে তৈরি এক থেকে আলাদা।


Sugar.JS এই উদ্দেশ্যে জন্য বর্ধিত বস্তু প্রদান করে। কোডটি পরিষ্কার এবং সহজ:

একটি বর্ধিত বস্তু তৈরি করুন:

a = Object.extended({})

এটির আকার পরীক্ষা করে দেখুন:

a.size()

ECMA 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

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






json