একটি জাভাস্ক্রিপ্ট অবজেক্টে উপাদানগুলির সংখ্যা


103

জাভাস্ক্রিপ্ট অবজেক্টে উপাদানের সংখ্যা (কোথাও থেকে) পাওয়ার উপায় আছে কি ?? (যেমন ধ্রুবক জটিলতা)।

আমি কোনও সম্পত্তি বা পদ্ধতি খুঁজে পাই না যা তথ্যটি পুনরুদ্ধার করে। এখন পর্যন্ত আমি কেবল পুরো সংগ্রহের মাধ্যমে একটি পুনরাবৃত্তি করার কথা ভাবতে পারি, তবে এটি লিনিয়ার সময়।
অবাক করা বিষয়বস্তুটির আকারের কোনও সরাসরি অ্যাক্সেস নেই, আপনি ভাবেন না।

সম্পাদনা:
আমি Objectবস্তুর কথা বলছি (সাধারণভাবে বস্তু নয়):

var obj = new Object ;

5
ইতিমধ্যে উত্তর এখানে দেওয়া stackoverflow.com/questions/126100/... Object.keys (obj) .length
spats

উত্তর:


155

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

অতীতে, মোজিলার জাভাস্ক্রিপ্ট বৈকল্পিকটি অ-মানক__count__ উন্মুক্ত করেছিল , তবে এটি সংস্করণ 1.8.5 দিয়ে সরানো হয়েছে।

ক্রস ব্রাউজারের স্ক্রিপ্টিংয়ের জন্য আপনি বৈশিষ্ট্যগুলির সাথে স্পষ্টভাবে পুনরাবৃত্তি করতে এবং চেক করতে আটকে গেছেন hasOwnProperty():

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

ECMAScript 5 সক্ষম প্রয়োগের ক্ষেত্রে, এটিকেও (Kudos to Avi Flax ) হিসাবে লেখা যেতে পারে

function countProperties(obj) {
    return Object.keys(obj).length;
}

মনে রাখবেন যে আপনি এমন গুণাবলীও মিস করবেন যা গণনাযোগ্য নয় (যেমন কোনও অ্যারের length)।

আপনি যদি jQuery, প্রোটোটাইপ, Mootools, $ যাই হোক না কেন-নতুন-হাইপ যেমন একটি কাঠামো ব্যবহার করছেন, তারা তাদের নিজস্ব সংগ্রহের API নিয়ে আসে কিনা তা পরীক্ষা করুন, যা দেশীয় জেএস বিষয়বস্তু ব্যবহার করার চেয়ে আপনার সমস্যার আরও ভাল সমাধান হতে পারে।


11
এটাকে আমি সর্বদা ভুলে গেছি rop আমি আপনাকে বলছি। নেট জমিতে খুব বেশি সময়। +1
অন্নাকাটা

2
jQuery এর সংগ্রহগুলির জন্য একটি বস্তু ব্যবহার করে যা এটি ক্যোয়ারী থেকে পাওয়া যায় এবং এটি একটি দৈর্ঘ্যের সম্পত্তি সহ সেই মানটি প্রকাশ করে।
নোসারেডা

6
ফায়ারফক্স 4 __count__চলে গেছে :(
টিমো হুভিনেন

1
প্রবেশ ছাড়া এটি করার কোনও উপায় আছে কি? আমি একই ধরণের বাঁধাই করছি তবে আমি যদি সম্ভব হয় তবে এটি জেএসলিন্ট দিয়ে দিতে চাই।
রাস্তার আলো

1
আমাদের দরকার কেন hasOwnProperty()?
সুইসউইস

99

যে কোনও ES5- সামঞ্জস্যপূর্ণ পরিবেশে এটি করতে

Object.keys(obj).length

(থেকে ব্রাউজার সমর্থন এখানে )
(চালু Object.keys ডক এখানে আপনি অ ECMA5 ব্রাউজার যোগ করতে পারেন পদ্ধতি, অন্তর্ভুক্ত)


2
এই উত্তরটি রাখার জন্য এটি সঠিক প্রশ্ন নয়। এটির সাহায্যে আপনি অবজেক্টের সমস্ত কীগুলি নিয়ে যাচ্ছেন, এগুলি একটি নতুন তৈরি করা অ্যারেতে রেখেছেন এবং তারপরে সেই নতুন অ্যারে থেকে দৈর্ঘ্যের সম্পত্তিটি উদ্ধার করছেন।
গেটফ্রি

11
এটি সবচেয়ে প্রোগ্রামগতভাবে দক্ষ নাও হতে পারে তবে এটি সর্বাধিক বিকাশকারী দক্ষ।
সুপারলুমিনিয়াম

9

যদি আপনি ইতিমধ্যেই আপনার Build এ jQuery ব্যবহার করা হয় শুধু এই একটি করুন:

$(yourObject).length

এটি আমার পক্ষে অবজেক্টগুলিতে দুর্দান্তভাবে কাজ করে এবং আমার ইতিমধ্যে নির্ভরতা হিসাবে jQuery ছিল।


5
আশ্চর্যজনক ... এটি আমার পক্ষে কাজ করে না। আমি সর্বদা 1. পাই। জেলকিএন এর উত্তর আমার পক্ষে কাজ করে।
মাইক রডেন্ট

3
এই কোডটি সর্বদা ফিরে আসে 1 মাত্র 1 অবজেক্ট। এটি এতে উপাদান গণনা করছে না
বিআরকেট

5
function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);

2

আফাইক, নির্ভরযোগ্যভাবে এটি করার কোনও উপায় নেই, যদি না আপনি কোনও অ্যারে পরিবর্তন করেন। কোনটি সত্যই, অদ্ভুত বলে মনে হয় না - এটি আমার কাছে বেশ সোজা মনে হয় যে অ্যারেগুলি গণনাযোগ্য এবং অবজেক্টগুলি তা নয়।

সম্ভবত আপনি সবচেয়ে কাছের পাবেন এটি কিছু এই

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

তবে এটি সমস্যা তৈরি করে বা কমপক্ষে প্রশ্ন তৈরি করে। সমস্ত ব্যবহারকারী-তৈরি বৈশিষ্ট্যগুলি গণনা করা হয়, _ লেন্থ ফাংশন নিজেই সহ! এবং এই সাধারণ উদাহরণে আপনি কেবল একটি সাধারণ ফাংশন ব্যবহার করে এড়াতে পারবেন, এর অর্থ এই নয় যে আপনি অন্যান্য স্ক্রিপ্টগুলি এটি করা থেকে বিরত করতে পারেন। তো তুমি কি কর? ফাংশন বৈশিষ্ট্য উপেক্ষা করবেন?

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

শেষ পর্যন্ত, আমার মনে হয় আপনার সম্ভবত অবজেক্টগুলি গণনাযোগ্য করার ধারণাটি খালি করা উচিত এবং আপনি যা করছেন তা করার অন্য কোনও উপায় খুঁজে বের করতে হবে।


8
ডেঞ্জার রবিনসন! অবজেক্টের বিরুদ্ধে প্রোটো করবেন না ! সবকিছু অবজেক্ট থেকে অবতীর্ণ হয়, আপনি যদি কোনও জেএস কাজ করার মতো পরিমাণে কাজ করে থাকেন তবে আপনি ক্লায়েন্ট প্রসেসিংটিকে এ জাতীয়ভাবে পঙ্গু করে দেবেন।
অন্নকাটা

5
আহ ... আপনি কি সেই অংশটি পড়েন নি যেখানে আমি একটি মন্তব্যে লিখেছিলাম "বানর উদ্দেশ্য করে কোনও কথা বলার জন্য" - স্মরণ, আমি ইচ্ছাকৃতভাবে এটি করেছি যাতে লোকেরা এটি সম্পর্কে কিছুটা উল্টে না যায়। তবুও, যদিও আমি বানরের প্যাচিংয়ের পক্ষে সমর্থন করি না, আপনি জাভাস্ক্রিপ্টে প্রোটোটাইপ চেইন কীভাবে কাজ করে তা আপনি ভুল বুঝেছেন যদি আপনি ভাবেন যে এটি পারফরম্যান্সের সমস্যার কারণ হতে পারে ভিডিও. yahoo.com/watch/111585/1027823
পিটার বেইলি

তো .. এটি একটি কর বা না?
অস্কার রাইজ

"জাভাস্ক্রিপ্ট: দ্য গুড পার্টস" -তে তিনি "তৈরি ()" পদ্ধতিতে প্রোটোটাইপস অবজেক্ট করেন। আমি জাভাস্ক্রিপ্ট উপর চূড়ান্ত বই যে beleive।
ক্রিস ডাট্রো

1

সংখ্যা / দৈর্ঘ্য / মাত্রিকতার ধারণাটি কোনও বস্তুর পক্ষে সত্যিকার অর্থে আসে না এবং এটির প্রয়োজনের পরামর্শ দেয় আপনি আমার কাছে সত্যই অ্যারে চান।

সম্পাদনা করুন: আমার কাছে নির্দেশ দেওয়া হয়েছে যে আপনি এর জন্য একটি ও (1) চান। আমার জ্ঞানের সর্বোপরি এমন কোনও উপায় নেই যা আমি ভীত।


তিনি নিজেকে পুনরাবৃত্তি করার প্রস্তাব করেছিলেন, যা এই সমাধান solution এটি অর্জনের জন্য তাঁর একটি ও (1)
টমাস হানসেন

আপনি বেশ ঠিক বলেছেন। সত্যিই প্রশ্নগুলি আরও ভাল করে পড়া উচিত।
অন্নাকাটা

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