কীভাবে জাভাস্ক্রিপ্টে কোনও বস্তুর কী / গুণাবলীর সংখ্যা দক্ষতার সাথে গণনা করতে হবে?


1543

কোন বস্তুর কী / গুণাবলীর সংখ্যা গণনা করার দ্রুততম উপায় কী? এটি অবজেক্টের উপর দিয়ে পুনরাবৃত্তি না করে এটি করা সম্ভব? অর্থাত্ না করেই

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

(ফায়ারফক্স একটি যাদু __count__সম্পত্তি সরবরাহ করেছিল, তবে এটি সংস্করণ ৪ এর আশেপাশে সরিয়ে দেওয়া হয়েছে)


3
সম্পর্কিত: stackoverflow.com/questions/5223/...
ripper234

2
বিভিন্ন উপায়ে একটি পারফরম্যান্স বেঞ্চমার্ক: jsben.ch/#/oSt2p
এসপেন নেটস্কেপ

উত্তর:


2513

নোড , ক্রোম, আইই 9+, ফায়ারফক্স 4+, বা সাফারি 5+ এর মতো কোনও ES5- সামঞ্জস্যপূর্ণ পরিবেশে এটি করতে :

Object.keys(obj).length

8
কেবল নোড.জেএস নয়, এমন কোনও পরিবেশ যা ইএস 5 সমর্থন করে
ই জিয়াং

59
বিটিডাব্লু ... সবেমাত্র কিছু পরীক্ষা চালিয়েছে ... এই পদ্ধতিটি ও (এন) সময়ে চলে। লুপের জন্য এ এই পদ্ধতির চেয়ে খুব খারাপ নয়। ** দু: খিত মুখ ** stackoverflow.com/questions/7956554/...
BMiner

161
-1 (-200 যদি আমি পারতাম) এটি কেবলমাত্র বস্তুর মাধ্যমে পুনরাবৃত্তি করে না তবে এটির সমস্ত কী দিয়ে একটি সম্পূর্ণ নতুন অ্যারে তৈরি করে, তাই এটি প্রশ্নের উত্তর দিতে সম্পূর্ণ ব্যর্থ হয়।
getFree

42
এটি (কমপক্ষে Chrome এ 25) করার চেয়ে অনেক দ্রুত বলে মনে হচ্ছে: jsperf.com/count-eferences-in-object
fserb

34
@ গেটফ্রি কেন এত থাম্বস আপ? কোডিংয়ের ক্ষেত্রে এটি অবশ্যই দ্রুততম উপায়। কোন অতিরিক্ত পদ্ধতি বা গ্রন্থাগার প্রয়োজন। কোড গতির ক্ষেত্রে, সম্ভবত এটি খুব খারাপও নয়। মোটেও সম্পূর্ণ ব্যর্থ নয়। 87 থাম্বস আপ আপনার জন্য ব্যর্থ।
অ্যান্ড্রু

150

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

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;

2
চেকের উদ্দেশ্য কী (Object.prototype.hasOwnProperty.call(obj, k))?
styfle

14
@ স্টাইফ্লে যদি আপনি বস্তুর বৈশিষ্ট্যগুলির পুনরাবৃত্তি করতে লুপের জন্য ব্যবহার করেন তবে আপনি প্রোটোটাইপ শৃঙ্খলেও বৈশিষ্ট্যগুলি পেতে পারেন। এজন্য চেক hasOwnPropertyকরা জরুরি। এটি কেবলমাত্র বস্তুতে সেট করা বৈশিষ্ট্যগুলি প্রদান করে।
রেনেয়াত ডি মইঙ্ক

13
@styfle এটিকে সহজ করার জন্য আপনি কেবল লিখতে পারেন obj.hasOwnProperty(k)(আমি আসলে এটি আমার মূল পোস্টে করেছি, তবে পরে এটি আপডেট করেছি)। hasOwnPropertyপ্রতিটি বস্তুতে উপলব্ধ কারণ এটি Objectপ্রোটোটাইপের অংশ , তবে বিরল ইভেন্টে যে এই পদ্ধতিটি সরানো হবে বা ওভাররাইড করা হবে আপনি অপ্রত্যাশিত ফলাফল পেতে পারেন। এটিকে কল করে এটি Object.prototypeআরও শক্তিশালী করে তোলে। ব্যবহারের callকারণ হ'ল আপনি objপ্রোটোটাইপের পরিবর্তে পদ্ধতিটি চালু করতে চান ।
রেনাট ডি মইঙ্ক


1
আপনি এটি একেবারে সঠিক আমার সংস্করণটি কাজ করার সময় এটি উদাহরণ হিসাবে খুব মৌলিক এবং মানসিক ment মজিলার কোডটি আরও নিরাপদ। (পিএস: আপনার
লিঙ্কটিও

137

আপনি ব্যবহার করে থাকেন Underscore.js আপনি ব্যবহার করতে পারেন _.size (@douwe ধন্যবাদ):
_.size(obj)

বিকল্পভাবে আপনি _.keys ব্যবহার করতে পারেন যা কারওর জন্য পরিষ্কার হতে পারে:
_.keys(obj).length

আমি প্রচুর বুনিয়াদি কাজ করার জন্য এটি একটি দৃ tight় লাইব্রেরি, ইন্ডারস্কোরকে অত্যন্ত সুপারিশ করি। যখনই সম্ভব তারা ECMA5 এর সাথে মেলে এবং দেশীয় বাস্তবায়নে পিছিয়ে।

অন্যথায় আমি @ অভিয়ের উত্তর সমর্থন করি। আমি MDC ডকটিতে একটি লিঙ্ক যুক্ত করতে এটি সম্পাদনা করেছি যাতে আপনি নন-ইসিএমএ 5 ব্রাউজারগুলিতে কী () পদ্ধতিটি যুক্ত করতে পারেন।


9
আপনি যদি আন্ডারস্কোর.জে ব্যবহার করেন তবে আপনার পরিবর্তে _. সাইজ ব্যবহার করা উচিত। ভাল কথাটি হ'ল আপনি যদি কোনওভাবে অ্যারে থেকে বস্তুতে পরিবর্তন হন বা বিপরীতে ফলাফল একই থাকে।
দ্বৈত

2
এবং আমার বোধগম্যতা থেকে লোডাশ সাধারণত আন্ডারস্কোরের চেয়ে ভাল (যদিও তারা অনুরূপ কাজ করে)।
মার্লিন মরগান-গ্রাহাম

1
@ মেরলিনমর্গান-গ্রাহাম যদি আমি সঠিকভাবে স্মরণ করি তবে লোডাশ মূলত আন্ডারস্কোরের কাঁটাচামচ ...
মোলসন 504 এক্স

6
_.keys(obj).lengthআমার পক্ষে সবচেয়ে ভাল কাজ করেছে, কারণ আমার রিটার্ন অবজেক্টটি কখনও কখনও এর মধ্যে কোনও বৈশিষ্ট্য ছাড়াই একটি সরল স্ট্রিং। _.size(obj)স্ট্রিংয়ের দৈর্ঘ্য আমাকে ফিরিয়ে দেয়, যখন _.keys(obj).length0 ফেরত দেয়
জ্যাকব স্ট্যাম

ও (এন) জটিলতা । লোডাশ এবং অ্যান্ডস্কোর Object.keysঅভ্যন্তরীণভাবে ব্যবহার করে। অ্যান্ডস্কোর প্রতিটি কী কী for..inলুপের ভিতরে একটি অ্যারেতে অনুলিপি করে Object.keysতা যদি সংজ্ঞায়িত না করা হয়।
এন কুদ্রিভতসেভ

82

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

সুতরাং এখানে সর্বাধিক ব্যবহৃত বিকল্পগুলি:

1. ECMAScript এর অবজেক্ট.কি ()

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

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

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

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

৩. একটি লুপের অনুকূলকরণ

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

অন্যথায়, আপনার কোড kস্থানীয় 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;

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


var k in myobjপারফরম্যান্স কেন বাড়াতে হবে ? আমি যতদূর জানি, কেবল ফাংশন জাভাস্ক্রিপ্টে নতুন সুযোগ ঘোষণা করে। লুপগুলি কি এই নিয়মের ব্যতিক্রম?
লার্স গিরুপ ব্রিংক নীলসন

1
এটা কি দ্রুত? for (var k in myobj) hasOwn.call(myobj, k) && ++count;অর্থাত্ যদি স্টেটমেন্টটি একটি সাধারণ && এর সাথে প্রতিস্থাপন করে?
হামজা কুব্বা

শেষ জিনিস আপনার সাথে করতে পারেন: Object.getOwnPropertyNames(obj).length; অনেক সহজ।
উইল্ট করুন

29

আপনি যদি আসলে কোনও পারফরম্যান্স সমস্যার মধ্যে চলে যান তবে আমি কলগুলিকে মোড়ানো পরামর্শ দিচ্ছি যা কোনও ফাংশন দিয়ে অবজেক্টের / থেকে বৈশিষ্ট্য যুক্ত / সরিয়ে দেবে যা উপযুক্ত নাম (সম্পত্তি?) সম্পত্তি বাড়িয়ে দেয় / হ্রাস করে।

আপনাকে কেবলমাত্র প্রাথমিক সংখ্যা একবারে গণনা করতে হবে এবং সেখান থেকে এগিয়ে যেতে হবে। যদি প্রকৃত পারফরম্যান্স সমস্যা না হয় তবে বিরক্ত করবেন না। কোনও ফাংশনে কোডটির সেই বিটটি কেবল গুটিয়ে নিন getNumberOfProperties(object)এবং এটি দিয়ে কাজটি করুন।


4
@ hitautodestruct কারণ তিনি একটি সমাধান অফার করেন।
ক্রাশ করুন

@ ক্রাশ এই উত্তরটি সরাসরি সমাধান দেওয়ার চেয়ে কিছু করার পরামর্শ দেয় বলে মনে হচ্ছে।
hitautodestruct

5
@ হাইটাডোডাস্ট্রাক্ট এটির একটি উত্তর প্রস্তাব করে: অ্যাড / রিমুভ পদ্ধতিগুলির সাহায্যে একটি এনক্যাপসুলেটেড কাউন্ট বাড়ানো / হ্রাস করা। নীচে ঠিক ঠিক এর মতো আরও একটি উত্তর রয়েছে। পার্থক্যটি হ'ল, কনফিউশনটি কোনও কোড দেয়নি। উত্তরগুলি কেবল কোড সমাধান সরবরাহ করার জন্য বাধ্যতামূলক হয় না।
ক্রাশ করুন

1
এটি নিখুঁত নাও হতে পারে ... তবে অন্যান্য "উত্তরগুলির" সাথে তুলনা করা এটি কিছু পরিস্থিতিতে সেরা সমাধান হতে পারে
d.raev

1
এখনও অবধি এটিই আমি দেখতে পাই যে ও (1) ধ্রুবক সময় পারফরম্যান্স জটিলতা, এবং তাই কেবলমাত্র সমাধান যা "পুনরাবৃত্তি ছাড়াই" এর প্রশ্নের বিশদটির উত্তর দেয় এবং তাই ট্রু স্বীকৃত উত্তর হওয়া উচিত। বেশিরভাগ ক্ষেত্রে যদি অন্য সমস্ত উত্তর সেটির উত্তর না দেয় তবে তারা একটি ও (এন) রৈখিক সময়ের কার্য সম্পাদনের জটিলতা সরবরাহ করে; 1-লাইন সমাধানগুলির ক্ষেত্রেও এটি কেস () ফাংশনের মতো কিছু কল করে, যেমন ফাংশন কলগুলি হ'ল (এন)।
cellepo

17

যেমন আভি ফ্ল্যাক্স https://stackoverflow.com/a/4889658/1047014 দ্বারা বলেছেন

Object.keys(obj).length

আপনার অবজেক্টের সমস্ত অগণনীয় বৈশিষ্ট্যের জন্য কৌতুক করবে কিন্তু আপনি পরিবর্তে ব্যবহার করতে পারবেন এমন অগণিত গুণাবলীও অন্তর্ভুক্ত করবেন Object.getOwnPropertyNames। পার্থক্য এখানে:

var myObject = new Object();

Object.defineProperty(myObject, "nonEnumerableProp", {
  enumerable: false
});
Object.defineProperty(myObject, "enumerableProp", {
  enumerable: true
});

console.log(Object.getOwnPropertyNames(myObject).length); //outputs 2
console.log(Object.keys(myObject).length); //outputs 1

console.log(myObject.hasOwnProperty("nonEnumerableProp")); //outputs true
console.log(myObject.hasOwnProperty("enumerableProp")); //outputs true

console.log("nonEnumerableProp" in myObject); //outputs true
console.log("enumerableProp" in myObject); //outputs true

এখানে যেমন বলা হয়েছে এতে একই ব্রাউজার সমর্থন রয়েছে hasObject.keys

তবে, বেশিরভাগ ক্ষেত্রে আপনি এই ধরণের অপারেশনে সংখ্যাসূচককে অন্তর্ভুক্ত করতে নাও চান, তবে পার্থক্যটি জানা সর্বদা ভাল))


1
উল্লেখ করার জন্য থাম্বস আপ Object.getOwnPropertyNames, আপনি এখানে একমাত্র ...
উইল্ট

15

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

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

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

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

আপনি যে কোনও সময় মায়োবজ রেফারেন্স করুন। __count__ফাংশন আগুন এবং পুনরায় গণনা করা হবে।


13
লক্ষ্য করুন Object.prototype.__count__গেকো 1.9.3 সরানো হচ্ছে: whereswalden.com/2010/04/06/... গণনা -property অফ বস্তু-is-হচ্ছে-মুছে /
dshaw

17
এখন যখন ফায়ারফক্স 4 চলে গেছে, এই উত্তরটি এখন অপ্রচলিত। Object.__count__চলে গেছে, এবং ভাল বিড়ম্বনা।
ইয়ি জিয়াং

1
আমি উত্তরটি অপ্রচলিত বলব না। এটি একটি ক্রিয়াকলাপে কোনও মান সজ্জিত করার জন্য এখনও একটি আকর্ষণীয় কৌশল।
devios1

প্রোটোটাইপ অবজেক্টটি প্রসারিত করার জন্য ব্যবহার করা উচিত
আরিয়া কার্টার-ওয়েয়ার

13

অ্যাভি ফ্ল্যাক্সের উত্তরটি পুনরুক্ত করার জন্য অবজেক্ট.কিজ (অবজেক্ট)। দৈর্ঘ্য সঠিক যে কোনও বস্তুর সাথে এটির সাথে বাঁধা ফাংশন নেই

উদাহরণ:

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)

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

ডকুমেন্টেশন এখানে পাওয়া যাবে http://underscorejs.org/ সেইসাথে গিথুব এবং অন্যান্য বিভিন্ন তথ্যের উত্স

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

_.size(obj)


সম্পর্কে আপনার মন্তব্যের জবাবে Array(obj).length: এটি কাজ করে না। http://jsfiddle.net/Jhy8M/
জেমি চং

হ্যাঁ আমি এটি আরও খানিকটা তাকিয়ে দেখলাম সম্ভব হলে উত্তরটি সরিয়ে ফেলতে চলেছি বা কেবল সমস্ত একসাথে সম্পাদনা করছি
বেলডান্ডু

আমি দেখতে পাচ্ছি না যে এটির একটির সাথে ফাংশনগুলির কোনও সম্পর্ক রয়েছে এবং ক্রোমে আমি এই আচরণটি মোটেই দেখছি না। আমি সন্দেহ করবে এই ডিফল্ট আচরণ সঙ্গে কি ছিল হতে পারে Object.defineProperty (): গণনীয় যা false, যদিও আমি এখনো কিভাবে কোন ডকুমেন্টেশন পাওয়া যায়নি থাকেন var obj = { a: true, b: true }থেকে ভিন্ন হতে পারে var obj = {}; obj.a = true; obj.b = true;অথবা শুধুমাত্র যদি একটি ভিন্ন ব্যাখ্যা / W3 এর শব্দার্থবিদ্যা হয়েছে ক্রোম দ্বারা গৃহীত হয়েছে।
নলো 8

10

উপরে উত্তর হিসাবে: Object.keys(obj).length

তবে: যেহেতু এখন আমাদের ES6 এ একটি আসল ম্যাপ ক্লাস রয়েছে তাই আমি কোনও বস্তুর বৈশিষ্ট্য ব্যবহার না করে এটি ব্যবহার করার পরামর্শ দেব ।

const map = new Map();
map.set("key", "value");
map.size; // THE fastest way

8

যাদের প্রকল্পে অন্তর্ভুক্ত রয়েছে অ্যান্ডস্কোর.জেএস তাদের জন্য আপনি এটি করতে পারেন:

_({a:'', b:''}).size() // => 2

বা কার্যকরী শৈলী:

_.size({a:'', b:''}) // => 2

8

তিনটি পদ্ধতির জন্য এখানে কিছু কর্মক্ষমতা পরীক্ষা করা হচ্ছে;

https://jsperf.com/get-the-number-of-keys-in-an-object

Object.keys ()। দৈর্ঘ্য

20,735 প্রতি সেকেন্ডে অপারেশন

খুব সহজ এবং সামঞ্জস্যপূর্ণ। দ্রুত কিন্তু ব্যয়বহুলভাবে চালায় কারণ এটি কীগুলির একটি নতুন অ্যারে তৈরি করে, যা এটি পরে ফেলে দেওয়া হয়।

return Object.keys(objectToRead).length;

কীগুলি দিয়ে লুপ করুন

15,734 প্রতি সেকেন্ডে অপারেশন

let size=0;
for(let k in objectToRead) {
  size++
}
return size;

কিছুটা ধীরে ধীরে, তবে মেমোরি ব্যবহারের কাছাকাছি কোথাও নেই, তাই আপনি যদি মোবাইল বা অন্যান্য ছোট মেশিনগুলির জন্য অনুকূল হয়ে আগ্রহী হন তবে সম্ভবত আরও ভাল

অবজেক্টের পরিবর্তে মানচিত্র ব্যবহার করা হচ্ছে

953,839,338 অপারেশন প্রতি সেকেন্ডে

return mapToRead.size;

মূলত, মানচিত্র তার নিজস্ব আকার ট্র্যাক করে তাই আমরা কেবল একটি নম্বর ক্ষেত্রটি ফিরিয়ে দিচ্ছি। দূরের, অন্য যে কোনও পদ্ধতির চেয়ে অনেক দ্রুত। যদি আপনার অবজেক্টের নিয়ন্ত্রণ থাকে তবে পরিবর্তে সেগুলি মানচিত্রে রূপান্তর করুন।


6

থেকে: https://developer.mozilla.org/en/docs/Web/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / অবজেক্ট / ডিফাইনপ্রোপার্টি

অবজেক্ট.ডিফাইনপ্রোপার্টি (অবজেক্ট, প্রোপ, ডেস্ক্রিপ্টর)

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

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(var i in myObj) {
     console.log(i + ":" + myObj[i]);
}

আউটপুট:

name:John Doe
email:leaked@example.com

দ্রষ্টব্য: এটি <আই 9 ব্রাউজারগুলিতে কাজ করে না।


যদি আপনি অন্তর্নির্মিত প্রোটোটাইপগুলি বা কোনও সম্পত্তি পলিফিল প্রসারিত করতে চলেছেন (যেমন বানর-প্যাচ), দয়া করে এটি সঠিকভাবে করুন: সামনের সামঞ্জস্যের জন্য, সম্পত্তিটি আগে উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখুন, তারপরে সম্পত্তিটি অগণনীয় করুন যাতে নিজের কীগুলি নির্মিত বস্তুগুলির দূষিত হয় না। পদ্ধতি জন্য ব্যবহার করুন প্রকৃত পদ্ধতি । আমার সুপারিশ: এই উদাহরণগুলি অনুসরণ করুন যা অন্তর্নির্মিত পদ্ধতির মতো যতটা সম্ভব ঘনিষ্ঠভাবে আচরণ করে এমন কোনও পদ্ধতি যুক্ত করতে কীভাবে তা দেখায় follow
user4642212

5

আমি কীভাবে এই সমস্যার সমাধান করেছি তা হল আমার নিজের একটি বেসিক তালিকার বাস্তবায়ন গড়ে তোলা যা বস্তুটিতে কতগুলি আইটেম সংরক্ষণ করা হয় তার একটি রেকর্ড রাখে। এটা খুবই সাধারণ. এটার মতো কিছু:

function BasicList()
{
   var items = {};
   this.count = 0;

   this.add = function(index, item)
   {
      items[index] = item;
      this.count++;
   }

   this.remove = function (index)
   {
      delete items[index];
      this.count--;
   }

   this.get = function(index)
   {
      if (undefined === index)
        return items;
      else
        return items[index];
   }
}

1
আকর্ষণীয় বিকল্প। এটি সামগ্রিক গণনা কার্যের ওভারহেডকে সরিয়ে দেয়, তবে প্রতিবার আপনি কোনও উপাদান যুক্ত বা সরিয়ে ফাংশন কলের দামে যা দুর্ভাগ্যক্রমে আরও খারাপ হতে পারে। আমি ব্যক্তিগতভাবে ডেটা এনক্যাপসুলেশন এবং কাস্টম পদ্ধতিগুলির জন্য এটি একটি সাধারণ অ্যারের তুলনায় সরবরাহ করতে পারে এমন তালিকা প্রয়োগের ব্যবহার করতাম, তবে যখন আমার কেবল দ্রুত আইটেম গণনা প্রয়োজন হয় না not
লুক 125

1
আমি আপনার উত্তরটি পছন্দ করি তবে আমিও একটি লেমিং এবং ক্লিক করা উর্ধ্বতন। এটি একটি আকর্ষণীয় দ্বিধা উপস্থাপন করে। আপনি আপনার নির্দেশাবলীতে কিছু আচরণের জন্য অ্যাকাউন্টিং করছেন না, যেমন আমার পরিস্থিতি যেখানে আমি ইতিমধ্যে আপনার উত্তরটিকে আপগ্রেটেড করেছি, তবে তারপরে আমাকে "ক্লিক আপভোট" করার নির্দেশ দেওয়া হয়েছে এবং করতে পারে না। নির্দেশটি নিঃশব্দে ব্যর্থ হয় তবে আমি এখানে আপনার সামগ্রী থেকে এসওতে জড়ো হয়েছি যে নিঃশব্দে ব্যর্থ হওয়া এমন কিছু নয় যা আপনি আপনার কোড করা পছন্দ করেন। শুধু একটি মাথা আপ.
L0j1k

1
আমি এই উত্তরটি সত্যিই পছন্দ করি, সুন্দর ডেটা স্ট্রাকচার। এবং যদি অ্যাড করার জন্য ফাংশন কলগুলির সাথে যদি কোনও পারফরম্যান্সের প্রভাব থাকে, তবে কোনও বস্তুর উপরে পুনরাবৃত্তি করতে হবে যদি তার থেকে অনেক বেশি পারফরম্যান্স উত্সাহ হয়। এটি দ্রুততম লুপ প্যাটেনের জন্য অনুমতি দেয়var i = basiclist.count while(i--){...}
লেক্স

কোনও মৌলিক তালিকায় অন্তত বেসিক চেক অন্তর্ভুক্ত করা উচিত নয়? addকোনও পুরানো আইটেম প্রতিস্থাপন করে কিনা বা removeঅ-বিদ্যমান সূচক সহ কল ​​করা হয়েছে কিনা তা পরীক্ষা করার মতো checking এছাড়াও undefinedবৈধ আইটেমের মান হলে তালিকার প্রদত্ত সূচক রয়েছে কিনা তা পরীক্ষা করা সম্ভব নয়।
রবার্ট

2
একটি তালিকা অর্ডার করা উচিত এবং পুনরাবৃত্তিযোগ্য। ডেটা কোনও বস্তুতে সঞ্চিত থাকে যাতে উপাদানগুলির ক্রমের কোনও গ্যারান্টি নেই। দৈর্ঘ্যের গর্তযুক্ত তালিকাটি আপনি কীভাবে খুঁজে পাবেন? this.count? সর্বোচ্চ সূচক মান? যদি আপনি একই সূচীতে দুটি আইটেম যুক্ত করেন তবে গণনাটি ত্রুটিযুক্ত অবস্থায় চলে যায়।
চূড়ান্ত গব্বলমেন্ট

4

আপনি Object.keys(data).lengthকী ডেটা থাকা জেএসএন বস্তুর দৈর্ঘ্য সন্ধান করতে ব্যবহার করতে পারেন


3

তাদের প্রকল্পে অতিরিক্ত জেএস 4 রয়েছে তাদের জন্য আপনি এটি করতে পারেন:

Ext.Object.getSize(myobj);

এর সুবিধাটি হ'ল এটি সমস্ত এক্সট্রা সামঞ্জস্যপূর্ণ ব্রাউজারগুলিতে (আই 6 IE আইই 8 অন্তর্ভুক্ত) কাজ করবে তবে আমি বিশ্বাস করি যে অন্যান্য পরামর্শযুক্ত সমাধানের মতো চলমান সময়টি ও (এন) এর চেয়ে ভাল আর কিছু নয়।


2

তুমি ব্যবহার করতে পার:

Object.keys(objectName).length; 

এবং

Object.values(objectName).length;

1

ওপিতে নির্দিষ্ট করা হয়নি যে বস্তুটি নোডলিস্ট কিনা তা যদি হয় তবে আপনি সরাসরি এটিতে দৈর্ঘ্যের পদ্ধতিটি ব্যবহার করতে পারেন । উদাহরণ:

buttons = document.querySelectorAll('[id=button)) {
console.log('Found ' + buttons.length + ' on the screen'); 

0

উপরের jQuery যদি কাজ না করে তবে চেষ্টা করুন

$(Object.Item).length

3
দেখে মনে হচ্ছে এটি Object.Itemবিদ্যমান নেই
লু 1255

-1

আমি মনে করি না এটি সম্ভব (অন্তত কিছু ইন্টার্নাল ব্যবহার না করে)। এবং আমি মনে করি না যে আপনি এটি অনুকূলিতকরণের মাধ্যমে অনেক কিছু অর্জন করবেন।


2
গৃহীত উত্তরগুলি দেখায় যে এটি করা যেতে পারে এবং লাভ করার মতো কিছুই নেই বলে মনে করার মতো আপনার কোনও প্রসঙ্গ নেই।
খালি

-1

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.