মূল প্রশ্নের উত্তরে, আপনি for/in
ভুলভাবে ব্যবহার করছেন । আপনার কোড ইন, key
সূচক হয়। সুতরাং, সিউডো-অ্যারের থেকে মান পেতে, আপনাকে করতে হবেlist[key]
এবং আইডি পেতে, আপনি করতেন list[key].id
। তবে, আপনার এটি করা উচিত নয়for/in
এটি প্রথম স্থানে ।
সংক্ষিপ্তসার (ডিসেম্বর 2018 এ যুক্ত)
কখনও ব্যবহার করবেন না for/in
কোনও নোডলিস্ট বা এইচটিএমএল সংগ্রহের পুনরাবৃত্তি । এটি এড়ানোর কারণগুলি নীচে বর্ণনা করা হয়েছে।
আধুনিক ব্রাউজারগুলির সমস্ত সাম্প্রতিক সংস্করণ (সাফারি, ফায়ারফক্স, ক্রোম, এজ) for/of
ডিওএম-তে সমস্ত সমর্থন পুনরাবৃত্তি যেমন সমর্থন করেnodeList
বাHTMLCollection
।
এখানে একটি উদাহরণ:
var list = document.getElementsByClassName("events");
for (let item of list) {
console.log(item.id);
}
পুরানো ব্রাউজারগুলি অন্তর্ভুক্ত করতে (আই.আই এর মতো জিনিসগুলি সহ), এটি সর্বত্র কাজ করবে:
var list= document.getElementsByClassName("events");
for (var i = 0; i < list.length; i++) {
console.log(list[i].id); //second console output
}
আপনার কেন ব্যবহার করা উচিত নয় এর ব্যাখ্যা for/in
for/in
একটি বস্তুর বৈশিষ্ট্য পুনরাবৃত্তি জন্য বোঝানো হয়। এর অর্থ এটি কোনও বস্তুর সমস্ত পুনরাবৃত্তিযোগ্য বৈশিষ্ট্য ফিরিয়ে দেবে। এটি কোনও অ্যারের জন্য কাজ করে প্রদর্শিত হতে পারে (অ্যারে উপাদানগুলি বা সিউডো-অ্যারে উপাদানগুলি ফেরত পাঠানোর জন্য), এটি বস্তুর অন্যান্য বৈশিষ্ট্যও ফিরিয়ে দিতে পারে যা আপনি অ্যারের-মতো উপাদানগুলির কাছ থেকে প্রত্যাশা করছেন তা নয়। এবং অনুমান করুন কী, কোনও HTMLCollection
বা nodeList
অবজেক্টের উভয়ই অন্যান্য বৈশিষ্ট্য থাকতে পারে যা for/in
পুনরাবৃত্তি সহ ফিরে আসবে । আমি কেবল ক্রোমে এটি চেষ্টা করেছি এবং আপনি যেভাবে পুনরাবৃত্তি করছেন এটি পুনরুক্তি করা তালিকার আইটেমগুলি পুনরুদ্ধার করবে (সূচি 0, 1, 2, ইত্যাদি ...), তবে বৈশিষ্ট্য length
এবং item
বৈশিষ্ট্যগুলি পুনরুদ্ধার করবে । for/in
পুনরাবৃত্তির কেবল একটি HTMLCollection জন্য কাজ করবে না।
আপনি কেন এইচটিএমএল সংগ্রহের পুনরাবৃত্তি করতে পারবেন না তার জন্য http://jsfiddle.net/jender00/FzZ2H/ দেখুন for/in
।
ফায়ারফক্সে, আপনার for/in
পুনরাবৃত্তি এই আইটেমগুলি ফেরত দেবে (বস্তুর সমস্ত পুনরাবৃত্তিযোগ্য বৈশিষ্ট্য):
0
1
2
item
namedItem
@@iterator
length
আশা করছি, এখন আপনি দেখতে কেন আপনি ব্যবহার করতে চান করতে পারেন for (var i = 0; i < list.length; i++)
পরিবর্তে যাতে আপনি শুধু পেতে 0
, 1
এবং 2
আপনার পুনরাবৃত্তির।
নীচে নীচে ব্রাউজারগুলি কীভাবে 2015-2018 সময়কালে আপনাকে পুনরাবৃত্তি করার অতিরিক্ত উপায় দেয় তার বিবর্তন ঘটেছে। আপনি উপরে বর্ণিত বিকল্পগুলি ব্যবহার করতে পারেন বলে আধুনিক ব্রাউজারগুলিতে এখন আরগুলির কোনওটির প্রয়োজন নেই।
2015 সালে ES6 এর জন্য আপডেট
ES6 এ যুক্ত করা হয়েছে Array.from()
এটি একটি অ্যারের মতো কাঠামোটিকে আসল অ্যারেতে রূপান্তর করবে। এটি একজনকে সরাসরি এইভাবে একটি তালিকা গণনা করতে দেয়:
"use strict";
Array.from(document.getElementsByClassName("events")).forEach(function(item) {
console.log(item.id);
});
ওয়ার্কিং ডেমো (ফায়ারফক্স, ক্রোম এবং এপ্রিল ২০১ 2016 হিসাবে প্রান্তে): https://jsfiddle.net/jfriend00/8ar4xn2s/
২০১S সালে ES6 এর জন্য আপডেট
আপনি এখন নিজের কোডটিতে এটি যুক্ত করে একটি NodeList
এবং একটি দিয়ে নির্মাণের জন্য ES6 ব্যবহার করতে পারেন HTMLCollection
:
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
HTMLCollection.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
তারপরে, আপনি এটি করতে পারেন:
var list = document.getElementsByClassName("events");
for (var item of list) {
console.log(item.id);
}
এটি ক্রোম, ফায়ারফক্স এবং এজের বর্তমান সংস্করণে কাজ করে। এটি কাজ করে কারণ এটি উভয় নোডলিস্ট এবং এইচটিএমএল সংগ্রহের প্রোটোটাইপগুলিতে অ্যারে পুনরুক্তকারী সংযুক্ত করে যাতে যখন তাদের / এর পুনরাবৃত্তি ঘটে তখন এটি পুনরাবৃত্ত করতে অ্যারে পুনরুক্তি ব্যবহার করে।
কার্যকারী ডেমো: http://jsfiddle.net/jender00/joy06u4e/ ।
ডিসেম্বর 2016 এ ES6 এর জন্য দ্বিতীয় আপডেট
ডিসেম্বর 2016 হিসাবে, Symbol.iterator
সমর্থনটি Chrome v54 এবং ফায়ারফক্স ভি 50 এ অন্তর্নির্মিত হয়েছে সুতরাং নীচের কোডটি নিজেই কাজ করে। এটি এজের জন্য এখনও অন্তর্নির্মিত নয়।
var list = document.getElementsByClassName("events");
for (let item of list) {
console.log(item.id);
}
ওয়ার্কিং ডেমো (ক্রোম এবং ফায়ারফক্সে): http://jsfiddle.net/jfriend00/3ddpz8sp/
ডিসেম্বর 2017 এ ES6 এর জন্য তৃতীয় আপডেট
ড 2017 এর হিসাবে, একটি জন্য এজ 41.16299.15.0 এই সামর্থ্য কাজ nodeList
হিসেবে document.querySelectorAll()
, কিন্তু না একটি HTMLCollection
হিসেবে document.getElementsByClassName()
তাই আপনি নিজে পুনরুক্তিকারীর একটি জন্য এজ এটি ব্যবহার করতে দায়িত্ব অর্পণ করা HTMLCollection
। তারা কেন সংগ্রহের প্রকারটি ঠিক করল, তা অন্যটি নয় তবে এটি সম্পূর্ণ রহস্য। তবে, আপনি এজ এর বর্তমান সংস্করণে কমপক্ষে document.querySelectorAll()
ES6 for/of
সিনট্যাক্সের ফলাফলটি ব্যবহার করতে পারেন ।
আমি উপরের জেএসফিডেলটিকেও আপডেট করেছি যাতে এটি উভয় HTMLCollection
এবং nodeList
পৃথক পৃথকভাবে পরীক্ষা করে এবং আউটপুটটি জেএসফিডালটিতেই ক্যাপচার করে।
মার্চ 2018 এ ES6 এর জন্য চতুর্থ আপডেট
তবে, সাফারিতেও সমর্থনটি Symbol.iterator
অন্তর্নির্মিত হয়েছে, তাই আপনি for (let item of list)
হয় document.getElementsByClassName()
বা এর জন্য ব্যবহার করতে পারেনdocument.querySelectorAll()
।
এপ্রিল 2018 এ ES6 এর জন্য পঞ্চম আপডেট
স্পষ্টতই, এর HTMLCollection
সাথে পুনরাবৃত্তি করার জন্য সমর্থন for/of
2018 এর পাতায় एज 18 এ আসবে।
নভেম্বর 2018 এ ES6 এর ষষ্ঠ আপডেট
আমি নিশ্চিত করতে পারি যে মাইক্রোসফ্ট এজ ভি 18 এর সাথে (এটি ফলস 2018 উইন্ডোজ আপডেটের অন্তর্ভুক্ত), আপনি এখন একটি এজেএল এইচটিএমএল সংগ্রহ এবং একটি নোডলিস্ট উভয়ই পুনরাবৃত্তি করতে পারেন /
সুতরাং, এখন সমস্ত আধুনিক ব্রাউজারগুলিতে for/of
এইচটিএমএল সংগ্রহ এবং নোডলিস্ট উভয় বস্তুর পুনরাবৃত্তির জন্য স্থানীয় সমর্থন রয়েছে ।