javascript কীভাবে দক্ষতার সাথে জাভাস্ক্রিপ্টে কোন বস্তুর কী / বৈশিষ্ট্যের সংখ্যা গণনা করা যায়?




9 Answers

আপনি এই কোডটি ব্যবহার করতে পারেন:

if (!Object.keys) {
    Object.keys = function (obj) {
        var keys = [],
            k;
        for (k in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, k)) {
                keys.push(k);
            }
        }
        return keys;
    };
}

তারপরে আপনি পুরোনো ব্রাউজারে এটি ব্যবহার করতে পারেন:

var len = Object.keys(obj).length;
javascript performance properties count key

একটি বস্তুর কী / বৈশিষ্ট্যের সংখ্যা গণনা করার দ্রুততম উপায় কী? এটা কি বস্তুর উপর পুনরাবৃত্তি ছাড়া এটি করতে সম্ভব? মানে না

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;

(ফায়ারফক্স একটি জাদু __count__ সম্পত্তি প্রদান করেছিল, কিন্তু এটি 4 সংস্করণের কাছাকাছি কোথাও সরিয়ে ফেলা হয়েছিল।)




স্ট্যান্ডার্ড অবজেক্ট বাস্তবায়ন ( ES5.1 অবজেক্ট অভ্যন্তরীণ বৈশিষ্ট্যাবলী এবং পদ্ধতি ) কোনও Object তার কী / বৈশিষ্ট্যের ট্র্যাক করার প্রয়োজন হয় না, সুতরাং কোনও Object আকার নির্ধারণ করার জন্য কোনও প্রমিত উপায় থাকা উচিত নয় যা স্পষ্টভাবে বা নিখুঁতভাবে তার কীগুলির উপর পুনরাবৃত্তি না করে ।

তাই এখানে সবচেয়ে সাধারণ বিকল্প ব্যবহার করা হয়:

1. ECMAScript এর Object.keys ()

Object.keys(obj).length; অভ্যন্তরীণভাবে একটি অস্থায়ী অ্যারে গণনা এবং তার দৈর্ঘ্য ফেরত চাবি উপর পুনরাবৃত্তি দ্বারা কাজ করে।

  • পেশাদার - পাঠযোগ্য এবং পরিষ্কার সিনট্যাক্স। স্থানীয় সমর্থন অনুপলব্ধ হলে একটি শিখা ছাড়া কোন লাইব্রেরি বা কাস্টম কোড প্রয়োজন
  • কনস - অ্যারে তৈরি করার কারণে মেমরি ওভারহেড।

2. লাইব্রেরি ভিত্তিক সমাধান

এই লাইব্রেরির প্রসঙ্গে অন্যান্য গ্রন্থাগার ভিত্তিক উদাহরণগুলি তাদের গ্রন্থাগারের প্রসঙ্গে দরকারী মূর্তি। একটি কর্মক্ষমতা দৃষ্টিকোণ থেকে, তবে, নিখুঁত নো-লাইব্রেরির কোডের তুলনায় লাভের কিছুই নেই কারণ সমস্ত লাইব্রেরি পদ্ধতি আসলে কোনও লুপ বা ES5 Object.keys (native বা shimmed) ধারণ করে।

3. জন্য একটি লুপ অপ্টিমাইজ করা

ফাংশন কল ওভারহেডের কারণে এই ধরনের একটি লুপের ধীরতম অংশ সাধারণতঃ .hasOwnProperty() কল হয়। তাই যখন আমি কেবল একটি JSON অবজেক্টের এন্ট্রির সংখ্যা চাই, আমি যদি কোনও কোড না করে থাকি এবং .hasOwnProperty() প্রসারিত না করি তবে আমি .hasOwnProperty() কলটি বাদ .hasOwnProperty()

অন্যথা, আপনার কোডটি স্থানীয়ভাবে ( var k ) তৈরি করে এবং পোস্টফিক্সের পরিবর্তে প্রিফিক্স-ইনক্রিমেন্ট অপারেটর ( ++count ) ব্যবহার করে খুব সামান্য অপ্টিমাইজ করা যেতে পারে।

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;

আরেকটি ধারণা hasOwnProperty পদ্ধতি ক্যাশে উপর নির্ভর করে:

var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;

প্রদত্ত পরিবেশে এটি দ্রুত বা না হোক এটি বেঞ্চমার্কিংয়ের একটি প্রশ্ন। অত্যন্ত সীমিত কর্মক্ষমতা লাভ যাইহোক আশা করা যেতে পারে।




আমি এটি করার কোনও উপায় সম্পর্কে সচেতন নই, তবে পুনরাবৃত্তিগুলি সর্বনিম্ন রাখতে, আপনি __count__ এর অস্তিত্ব পরীক্ষা করার চেষ্টা করতে পারেন এবং যদি এটি বিদ্যমান না (অর্থাত ফায়ারফক্স নয়) তাহলে আপনি বস্তুর উপর পুনরাবৃত্তি করতে পারেন এবং পরে ব্যবহারের জন্য যেমন সংজ্ঞা:

if (myobj.__count__ === undefined) {
  myobj.__count__ = ...
}

এইভাবে যে কোনও ব্রাউজার __count__ সমর্থন __count__ সেটি ব্যবহার করবে এবং পুনরাবৃত্তি শুধুমাত্র তাদের জন্য করা হবে যা না। যদি গণনা পরিবর্তন হয় এবং আপনি এটি না করতে পারেন তবে আপনি সর্বদা এটি একটি ফাংশন তৈরি করতে পারেন:

if (myobj.__count__ === undefined) {
  myobj.__count__ = function() { return ... }
  myobj.__count__.toString = function() { return this(); }
}

যে কোন সময় আপনি myobj উল্লেখ। __count__ ফাংশন আগুন এবং পুনরায় হিসাব করা হবে।




এভি ফ্ল্যাক্স উত্তরটি object.keys (obj) উপর পুনরাবৃত্তি করার জন্য। দৈর্ঘ্যটি এমন একটি বস্তুর জন্য সঠিক যা তার সাথে সংযুক্ত ফাংশন না থাকে

উদাহরণ:

obj = {"lol": "what", owo: "pfft"};
Object.keys(obj).length; // should be 2

বনাম

arr = [];
obj = {"lol": "what", owo: "pfft"};
obj.omg = function(){
    _.each(obj, function(a){
        arr.push(a);
    });
};
Object.keys(obj).length; // should be 3 because it looks like this 
/* obj === {"lol": "what", owo: "pfft", omg: function(){_.each(obj, function(a){arr.push(a);});}} */

এই এড়াতে পদক্ষেপ:

  1. কোন বস্তুর মধ্যে ফাংশন রাখুন না যা আপনি কীগুলির সংখ্যা গণনা করতে চান

  2. একটি পৃথক বস্তু ব্যবহার করুন অথবা বিশেষভাবে ফাংশনগুলির জন্য একটি নতুন বস্তু তৈরি করুন (যদি আপনি গণনা করতে চান যে ফাইলটি Object.keys(obj).length ব্যবহার করে ফাইলটিতে কতগুলি ফাংশন আছে। Object.keys(obj).length )

এছাড়াও হ্যাঁ আমি আমার উদাহরণে নোডজ থেকে _ বা আন্ডারস্কোর মডিউল ব্যবহার করেছি

ডকুমেন্টেশন এখানে পাওয়া যাবে Underscore.js পাশাপাশি Github এবং অন্যান্য অন্যান্য তথ্যের উপর তার উৎস

এবং অবশেষে একটি লোডশ বাস্তবায়ন https://lodash.com/docs#size

_.size(obj)




থেকে: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Object.defineProperty (obj, prop, descriptor)

আপনি এটি আপনার সমস্ত বস্তুতে যুক্ত করতে পারেন:

Object.defineProperty(Object.prototype, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

অথবা একটি একক বস্তু:

var myObj = {};
Object.defineProperty(myObj, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

উদাহরণ:

var myObj = {};
myObj.name  = "John Doe";
myObj.email = "leaked@example.com";
myObj.length; //output: 2

যেভাবে যোগ করা হয়েছে, এটি for..in loops এ প্রদর্শিত হবে না:

for(var i in myObj) {
     console.log(i + ":" + myObj[i]);
}

আউটপুট:

name:John Doe
email:leaked@example.com

নোট: এটি <IE9 ব্রাউজারে কাজ করে না।




তাদের প্রোজেক্টে এক্সএইচএস 4 আছে যাদের জন্য আপনি করতে পারেন:

Ext.Object.getSize(myobj);

এর সুবিধা হল এটি সমস্ত এক্সটি সামঞ্জস্যপূর্ণ ব্রাউজারগুলিতে কাজ করবে (IE6-IE8 অন্তর্ভুক্ত) তবে, আমি বিশ্বাস করি যে চলমান সময় O (n) এর চেয়ে ভাল নয় তবে অন্যান্য প্রস্তাবিত সমাধানগুলির মতো।




উপরের jQuery কাজ করে না, তাহলে চেষ্টা করুন

$(Object.Item).length



আমি এটি সব বস্তুর জন্য এটি উপলব্ধ করার চেষ্টা করি:

Object.defineProperty(Object.prototype, "length", {
get() {
    if (!Object.keys) {
        Object.keys = function (obj) {
            var keys = [],k;
            for (k in obj) {
                if (Object.prototype.hasOwnProperty.call(obj, k)) {
                    keys.push(k);
                }
            }
            return keys;
        };
    }
    return Object.keys(this).length;
},});

console.log({"Name":"Joe","Age":26}.length) //returns 2






Related