জাভাস্ক্রিপ্টে একটি অ্যারের উপরে প্রতিটি জন্য


4680

আমি কীভাবে জাভাস্ক্রিপ্ট ব্যবহার করে অ্যারের সমস্ত এন্ট্রিগুলি লুপ করব?

আমি ভেবেছিলাম এটি এমন কিছু ছিল:

forEach(instance in theArray)

theArrayআমার অ্যারেটি কোথায় , তবে এটি ভুল বলে মনে হচ্ছে।


16
আমি এটি সন্ধান করেছি, কিন্তু আমি সন্ধান করেছি forEach এবং ঠিক নয় for। যেমনটি বলা হয়েছে, সি # তে এটি কিছুটা আলাদা ছিল এবং এটি আমাকে বিভ্রান্ত করেছিল :)
ড্যান্ট ১৯8686

6
ECMAScript & nbsp; 6 এ সম্ভবত "এর ... এর" জন্য কনস্ট্রাক্ট থাকবে। আরও তথ্যের জন্য ... (এমডিএন) এর জন্য দেখুন। আপনি ইতিমধ্যে সাম্প্রতিক ফায়ারফক্স সংস্করণ দিয়ে এটি ব্যবহার করে দেখতে পারেন।
স্ল্যাভেন রেজিক

35
অ্যারে.ফোর্চা প্রতিটি জাভাস্ক্রিপ্টে অ্যারেগুলির জন্য () এর চেয়ে প্রায় 95% ধীর। অনলাইনে এই পারফরম্যান্স পরীক্ষাটি দেখুন: jsperf.com/ رف
েষ্ট-

77
অনেক পরিস্থিতিতে 95% ধীর গতি তাত্পর্যপূর্ণ হতে চলেছে না blog.niftysnippets.org/2012/02/foreach-and-runtime-cost.html
ডেভিড সাইকেস

7
বিপরীতে, পাইথনে লুপগুলির জন্য traditionalতিহ্যবাহী ব্যবহারের চেয়ে ফাংশনগুলি ব্যবহার করা আরও দক্ষ । (এটি বিবেচনা করুন i < lenএবং i++দোভাষীর পরিবর্তে ইঞ্জিন দ্বারা করা যেতে পারে))
জোয়েটউইডল

উত্তর:


7014

টি এল; ডিআর

  • for-inআপনি এটি সুরক্ষার সাথে ব্যবহার না করা বা এটি আপনাকে কেন কাটাতে পারে সে সম্পর্কে কমপক্ষে সচেতন না হলে ব্যবহার করবেন না ।
  • আপনার সেরা বেট সাধারণত হয়

    • একটি for-ofলুপ (কেবলমাত্র ES2015 +),
    • Array#forEach( spec| MDN) (বা এর আত্মীয় someএবং এরকম) (কেবল ES5 +),
    • একটি সাধারণ পুরানো ধরণের forলুপ,
    • বা for-inসুরক্ষার সাথে।

তবে অন্বেষণ করার, পড়ার মতো আরও অনেক কিছুই আছে ...


জাভা স্ক্রিপ্টে অ্যারে এবং অ্যারের মতো অবজেক্টগুলির মাধ্যমে লুপিংয়ের জন্য শক্তিশালী শব্দার্থক শব্দ রয়েছে। আমি উত্তরটি দুটি ভাগে বিভক্ত করেছি: খাঁটি অ্যারেগুলির জন্য বিকল্পগুলি এবং ঠিক এমন অ্যারেগুলির মতো বিকল্পগুলির জন্য বিকল্পগুলি , যেমন argumentsবস্তু, অন্যান্য পুনরাবৃত্ত বস্তু (ES2015 +), ডোম সংগ্রহ এবং আরও অনেক কিছু on

আমি তাড়াতাড়ি করে মনে রাখবেন আপনি ES2015 অপশন ব্যবহার করতে পারেন করব এখন , এমনকি ES5 ইঞ্জিনের উপর দ্বারা transpiling ES5 করার ES2015। "ES2015 ট্রান্সপ্লিং" / "ES6 ট্রান্সপ্লাইং" আরও জন্য অনুসন্ধান করুন ...

ঠিক আছে, আসুন আমাদের বিকল্পগুলি দেখুন:

প্রকৃত অ্যারেগুলির জন্য

আপনার ECMAScript 5 ("ES5") এ তিনটি বিকল্প রয়েছে , সংস্করণটি এই মুহূর্তে সর্বাধিক বিস্তৃতভাবে সমর্থিত এবং ECMAScript 2015 ("ES2015", "ES6") এ আরও দুটি যুক্ত হয়েছে :

  1. ব্যবহার forEachএবং সম্পর্কিত (ES5 +)
  2. একটি সাধারণ forলুপ ব্যবহার করুন
  3. সঠিকভাবে ব্যবহার করুনfor-in
  4. ব্যবহার করুন for-of(স্পষ্টভাবে একটি পুনরুক্তি ব্যবহার করুন ) (ES2015 +)
  5. একটি পুনরাবৃত্তি স্পষ্টভাবে ব্যবহার করুন (ES2015 +)

বিবরণ:

1. ব্যবহার forEachএবং সম্পর্কিত

যে কোনও অস্পষ্ট-আধুনিক পরিবেশে (সুতরাং, IE8 নয়) যেখানে আপনার ArrayES5 (সরাসরি বা পলিফিল ব্যবহার করে) যুক্ত বৈশিষ্ট্যগুলিতে অ্যাক্সেস রয়েছে, আপনি forEach( spec| MDN) ব্যবহার করতে পারেন :

var a = ["a", "b", "c"];
a.forEach(function(entry) {
    console.log(entry);
});

forEachএকটি কলব্যাক ফাংশন গ্রহণ করে এবং allyচ্ছিকভাবে, thisসেই কলব্যাকটি কল করার সময় ব্যবহার করার মতো একটি মান (উপরে ব্যবহৃত হয় না)। অ্যারেতে প্রতিটি প্রবেশের জন্য কলব্যাক কল করা হয় যাতে ক্রমবর্ধমান অ্যারেগুলিতে অস্তিত্বহীন এন্ট্রিগুলি এড়ানো যায়। যদিও আমি কেবল উপরে একটি যুক্তি ব্যবহার করেছি, কলব্যাকটি তিনটি দিয়ে কল করা হয়েছে: প্রতিটি প্রবেশের মান, সেই প্রবেশের সূচক এবং আপনি যে অ্যারেটির উপরে পুনরাবৃত্তি করছেন তার একটি রেফারেন্স (যদি আপনার ফাংশনটি ইতিমধ্যে কার্যকর না হয় তবে) )।

আপনি যদি IE8 এর মতো অপ্রচলিত ব্রাউজারগুলিকে সমর্থন না করেন (যা নেট অ্যাপস সেপ্টেম্বর ২০১ in-এ এই লেখার হিসাবে 4% এর বেশি বাজার ভাগ দেখায়), আপনি খুশিতে forEachশিম ছাড়াই সাধারণ উদ্দেশ্যে ওয়েব পৃষ্ঠায় ব্যবহার করতে পারেন । যদি আপনার অপ্রচলিত ব্রাউজারগুলিকে সমর্থন করার প্রয়োজন হয় তবে শিমিং / পলফিলিং forEachসহজেই হয়ে যায় (বেশ কয়েকটি বিকল্পের জন্য "এসএস শিম" অনুসন্ধান করুন)।

forEach আপনার এই সুবিধাটি রয়েছে যে আপনাকে ইনডেক্সিং এবং মান ভেরিয়েবলগুলি সমাহারযোগ্য স্কোপ হিসাবে ঘোষণা করতে হবে না কারণ এগুলি পুনরাবৃত্তি ফাংশনে আর্গুমেন্ট হিসাবে সরবরাহ করা হয় এবং কেবলমাত্র সেই পুনরাবৃত্তিতে খুব সুন্দরভাবে স্কোপ করা হয়।

আপনি যদি প্রতিটি অ্যারে প্রবেশের জন্য একটি ফাংশন কল করার রানটাইম ব্যয় সম্পর্কে উদ্বিগ্ন হন তবে তা হবেন না; বিশদ

অতিরিক্তভাবে, forEach"ফাংশনটি তাদের সকলের মাধ্যমেই হয়" তবে ES5 আরও অনেকগুলি দরকারী "অ্যারের মাধ্যমে আপনার পথে কাজ করে কাজগুলি করুন" ফাংশন সংজ্ঞায়িত করে:

  • every(প্রথমবার কলব্যাক ফিরে আসে falseবা মিথ্যা কিছু বলে লুপিং বন্ধ করে দেয় )
  • some(প্রথমবার কলব্যাক ফিরে আসে trueবা সত্যবাদী কিছু লুপ করা বন্ধ করে দেয়)
  • filter(ফিল্টার ফাংশনটি ফিরে আসে trueএবং যেখানে ফিরে আসে সেখানে বাদ দিয়ে এমন উপাদানগুলি সহ একটি নতুন অ্যারে তৈরি করে false)
  • map (কলব্যাক দিয়ে ফিরে আসা মানগুলি থেকে একটি নতুন অ্যারে তৈরি করে)
  • reduce (বারবার কলব্যাক কল করে, পূর্বের মানগুলিতে পাস করে একটি মান বাড়িয়ে তোলে; বিশদটির জন্য অনুমানটি দেখুন; অ্যারের সামগ্রী এবং অন্যান্য অনেকগুলি সামগ্রীর সংমিশ্রনের জন্য দরকারী)
  • reduceRight(যেমন reduce, তবে আরোহী ক্রমের পরিবর্তে অবতরণে কাজ করে)

2. একটি সাধারণ forলুপ ব্যবহার করুন

কখনও কখনও পুরানো উপায়গুলি সেরা:

var index;
var a = ["a", "b", "c"];
for (index = 0; index < a.length; ++index) {
    console.log(a[index]);
}

অ্যারের দৈর্ঘ্য লুপ সময় পরিবর্তন না হলে, এবং এটি (অসম্ভাব্য) কার্য সম্পাদন সংবেদনশীল কোডে আছে, সামান্য আরো জটিল সংস্করণ সামনে দৈর্ঘ্য দখল একটি হতে পারে অতি ক্ষুদ্র বিট দ্রুততর:

var index, len;
var a = ["a", "b", "c"];
for (index = 0, len = a.length; index < len; ++index) {
    console.log(a[index]);
}

এবং / বা পিছনে গণনা:

var index;
var a = ["a", "b", "c"];
for (index = a.length - 1; index >= 0; --index) {
    console.log(a[index]);
}

তবে আধুনিক জাভাস্ক্রিপ্ট ইঞ্জিনগুলির সাথে, আপনার শেষের রসটি বের করা খুব বিরল।

ES2015 এবং উচ্চতর ক্ষেত্রে, আপনি আপনার সূচক এবং মান ভেরিয়েবলগুলি forলুপে স্থানীয় করতে পারেন :

let a = ["a", "b", "c"];
for (let index = 0; index < a.length; ++index) {
    let value = a[index];
    console.log(index, value);
}
//console.log(index);   // would cause "ReferenceError: index is not defined"
//console.log(value);   // would cause "ReferenceError: value is not defined"

আর যখন আপনি যে কি, শুধু valueবরং indexপ্রতিটি লুপ পুনরাবৃত্তির জন্য recreated হয়, লুপ শরীরের নির্মিত, যার অর্থ বন্ধ একটি রেফারেন্স রাখতে index(এবং value) যে নির্দিষ্ট পুনরাবৃত্তির তৈরি করা হয়েছে:

let divs = document.querySelectorAll("div");
for (let index = 0; index < divs.length; ++index) {
    divs[index].addEventListener('click', e => {
        console.log("Index is: " + index);
    });
}

আপনার যদি পাঁচটি ডিভ থাকে, আপনি যদি প্রথমটি ক্লিক করেন তবে "সূচকটি হ'ল: 0" এবং আপনি সর্বশেষে ক্লিক করলে "সূচকটি হ'ল: 4" পাবেন। আপনি যদি এর পরিবর্তে ব্যবহার করেন তবে এটি কাজ করে নাvarlet

৩. সঠিকভাবে ব্যবহার করুনfor-in

লোকেরা আপনাকে ব্যবহার করতে বলবে for-in, তবে এটি সেটির for-inজন্য নয়for-inমাধ্যমে loops একটি বস্তুর গণনীয় বৈশিষ্ট্য , না একটি অ্যারের ইনডেক্স। অর্ডার গ্যারান্টিযুক্ত নয়, এমনকি ES2015 (ES6) এও নয়। ES2015 অবজেক্ট বৈশিষ্ট্য একটি আদেশ সংজ্ঞায়িত করে (মাধ্যমে [[OwnPropertyKeys]], [[Enumerate]]ও যার অস্তিত্ব তাদের ব্যবহার পছন্দ Object.getOwnPropertyKeys), কিন্তু এটি সংজ্ঞায়িত না যে for-in, যাতে অনুসরণ করবে; যদিও ES2020 করেছে। ( এই অন্যান্য উত্তরে বিশদ ।)

for-inঅ্যারেতে কেবল আসল ব্যবহারের ক্ষেত্রে হ'ল:

  • এটা একটা ব্যাপার বিক্ষিপ্ত অ্যারে সঙ্গে বৃহদায়তন , এটা ফাঁক বা
  • আপনি অ-উপাদান উপাদান ব্যবহার করছেন এবং আপনি এগুলিকে লুপে অন্তর্ভুক্ত করতে চান

কেবলমাত্র সেই প্রথম উদাহরণটির দিকে তাকানো: আপনি for-inযদি যথাযথ সুরক্ষার ব্যবস্থা ব্যবহার করেন তবে আপনি সেই বিচ্ছুরিত অ্যারে উপাদানগুলি ঘুরে দেখার জন্য ব্যবহার করতে পারেন :

// `a` is a sparse array
var key;
var a = [];
a[0] = "a";
a[10] = "b";
a[10000] = "c";
for (key in a) {
    if (a.hasOwnProperty(key)  &&        // These checks are
        /^0$|^[1-9]\d*$/.test(key) &&    // explained
        key <= 4294967294                // below
        ) {
        console.log(a[key]);
    }
}

তিনটি চেক নোট করুন:

  1. যে নামটির সাথে ওই বস্তুর নিজস্ব সম্পত্তি রয়েছে (এটি তার প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত নয়) এবং

  2. যে কীটি হ'ল দশমিক সংখ্যা (যেমন, স্বাভাবিক স্ট্রিং ফর্ম, বৈজ্ঞানিক স্বরলিপি নয়) এবং

  3. যে কোনও সংখ্যায় জোর করা হলে কীটির মান <= 2 ^ 32 - 2 (যা 4,294,967,294)। এই সংখ্যাটি কোথা থেকে আসে? এটি স্পেসিফিকেশনে একটি অ্যারে সূচকের সংজ্ঞাটির অংশ । অন্যান্য সংখ্যা (অ-পূর্ণসংখ্যার, নেতিবাচক সংখ্যা, 2 ^ 32 - 2 এর চেয়ে বেশি সংখ্যার) অ্যারে সূচকগুলি নয়। এটি 2 ^ 32 - 2 এর কারণটি হ'ল এটিই সর্বোচ্চ সূচক মানকে 2 ^ 32 - 1 এর চেয়ে কম করে তোলে, এটি অ্যারেরের সর্বোচ্চ মূল্য lengthহতে পারে। (উদাহরণস্বরূপ, একটি অ্যারের দৈর্ঘ্য 32-বিট স্বাক্ষরবিহীন পূর্ণ পূর্ণসংখ্যায় ফিট করে)) ( আমার ব্লগ পোস্টে আমার আগের পরীক্ষাটি বেশ সঠিক ছিল না এমন মন্তব্যে ইঙ্গিত করার জন্য রবকে প্রপস করে ))

আপনি অবশ্যই ইনলাইন কোডে এটি করবেন না। আপনি একটি ইউটিলিটি ফাংশন লিখতে চাই। সম্ভবত:

4. ব্যবহার করুন for-of(স্পষ্টভাবে একটি পুনরুক্তি ব্যবহার করুন ) (ES2015 +)

ES2015 যোগ iterators জাভাস্ক্রিপ্ট করতে। পুনরুক্তিকারীদের ব্যবহারের সহজতম উপায় হ'ল নতুন for-ofবিবৃতি। দেখে মনে হচ্ছে:

const a = ["a", "b", "c"];
for (const val of a) {
    console.log(val);
}

কভারগুলির নীচে, এটি অ্যারে থেকে একটি পুনরুক্তি পেতে পারে এবং এর মধ্য দিয়ে লুপ করে, এটি থেকে মানগুলি পাবে। এটি ব্যবহার করে for-inএমন সমস্যা নেই যেহেতু এটি অবজেক্ট (অ্যারে) দ্বারা সংজ্ঞায়িত একটি পুনরুক্তি ব্যবহার করে এবং অ্যারেগুলি সংজ্ঞায়িত করে যে তাদের পুনরাবৃত্তিগুলি তাদের এন্ট্রিগুলির মাধ্যমে পুনরাবৃত্তি করে (তাদের বৈশিষ্ট্য নয়)। for-inইএস 5 এর বিপরীতে , প্রবেশাগুলি যে ক্রমটিতে প্রবেশ করা হয় তা হ'ল তাদের সূচকের সংখ্যার ক্রম order

5. একটি পুনরাবৃত্তি স্পষ্টভাবে ব্যবহার করুন (ES2015 +)

কখনও কখনও, আপনি একটি পুনরাবৃত্তি স্পষ্টভাবে ব্যবহার করতে চাইতে পারেন । আপনি এটি করতেও পারেন, যদিও এটি এর চেয়ে অনেক ক্লানকিয়ার for-of। দেখে মনে হচ্ছে:

const a = ["a", "b", "c"];
const it = a.values();
let entry;
while (!(entry = it.next()).done) {
    console.log(entry.value);
}

পুনরুক্তি একটি স্পেসিফিকেশন মধ্যে Iterator সংজ্ঞা মেলে একটি বস্তু। আপনি যতবার কল করবেন এর nextপদ্ধতিটি নতুন ফলাফলের বস্তুটি ফেরত দেয়। ফলাফল অবজেক্টটির একটি সম্পত্তি রয়েছে, doneএটি আমাদের হয়ে গেছে কিনা তা valueজানিয়ে দেয় এবং সেই পুনরাবৃত্তির মান সহ একটি সম্পত্তি রয়েছে। ( doneএটি যদি হয় তবে এটি alচ্ছিক false, valueএটি যদি ifচ্ছিক হয় undefined))

valueপুনরুক্তির উপর নির্ভর করে এর অর্থ পরিবর্তিত হয়; অ্যারে সমর্থন করে (কমপক্ষে) তিনটি ফাংশন যা পুনরাবৃত্তিকারীদের ফিরিয়ে দেয়:

  • values(): এটি আমি উপরে ব্যবহার করেছি। এটি একটি পুনরুক্তিকারীর যেখানে প্রতিটি ফেরৎ valueযে পুনরাবৃত্তির জন্য অ্যারের এন্ট্রি ( "a", "b", এবং "c"উদাহরণ আগের মধ্যে)।
  • keys(): রিটার্নস কোনো ইটারেটরে যেখানে প্রতিটি valueযে পুনরাবৃত্তির জন্য চাবিকাঠি (তাই আমাদের জন্য aউপরে, যে হবে "0", তারপর "1", তারপর "2")।
  • entries(): valueএমন একটি [key, value]পুনরাবৃত্তি প্রদান করে যেখানে প্রতিটি সেই পুনরাবৃত্তির জন্য ফর্মের একটি অ্যারে is

অ্যারে-লাইক অবজেক্টের জন্য

সত্যিকারের অ্যারেগুলি বাদে, অ্যারের মতো বস্তুগুলিও lengthরয়েছে যাগুলির একটি সংখ্যা এবং সংখ্যার নাম সহ বৈশিষ্ট্য রয়েছে: NodeListউদাহরণস্বরূপ, argumentsবস্তু ইত্যাদি we আমরা কীভাবে তাদের সামগ্রীগুলি লুপ করব?

অ্যারেগুলির জন্য উপরের যে কোনও বিকল্প ব্যবহার করুন

উপরের অ্যারে পদ্ধতির মধ্যে কমপক্ষে কয়েকটি এবং সম্ভবত বেশিরভাগ বা সমস্ত কিছু অ্যারে-জাতীয় বস্তুগুলিতে প্রায়শই সমানভাবে ভাল প্রয়োগ করা হয়:

  1. ব্যবহার forEachএবং সম্পর্কিত (ES5 +)

    উপরের বিভিন্ন ফাংশনগুলি Array.prototype"ইচ্ছাকৃত জেনেরিক" এবং সাধারণত Function#callবা এর মাধ্যমে অ্যারের মতো বস্তুগুলিতে ব্যবহার করা যেতে পারে Function#apply। ( এই উত্তরের শেষে হোস্ট-সরবরাহিত বস্তুর জন্য গুহাটি দেখুন , তবে এটি একটি বিরল বিষয়))

    আপনি ব্যবহার করতে চেয়েছিলেন ধরুন forEachএকটি উপর Node'র childNodesসম্পত্তি। আপনি এটি করবেন:

    Array.prototype.forEach.call(node.childNodes, function(child) {
        // Do something with `child`
    });

    আপনি যদি এটি অনেক কিছু করতে চলেছেন তবে আপনি ফাংশন রেফারেন্সের একটি অনুলিপি পুনঃব্যবহারের জন্য একটি ভেরিয়েবলের মধ্যে নিতে পারেন, যেমন:

    // (This is all presumably in some scoping function)
    var forEach = Array.prototype.forEach;
    
    // Then later...
    forEach.call(node.childNodes, function(child) {
        // Do something with `child`
    });
  2. একটি সাধারণ forলুপ ব্যবহার করুন

    স্পষ্টতই, সরল forলুপটি অ্যারের মতো অবজেক্টগুলিতে প্রযোজ্য।

  3. সঠিকভাবে ব্যবহার করুনfor-in

    for-inঅ্যারের মতো একই সুরক্ষার সাথে অ্যারের মতো বস্তুগুলির সাথেও কাজ করা উচিত; উপরে # 1 এ হোস্ট-সরবরাহিত সামগ্রীর জন্য সতর্কবার্তা প্রয়োগ হতে পারে।

  4. ব্যবহার করুন for-of(স্পষ্টভাবে একটি পুনরুক্তি ব্যবহার করুন ) (ES2015 +)

    for-ofঅবজেক্ট দ্বারা সরবরাহিত পুনরুক্তি ব্যবহার করে (যদি থাকে)। এতে হোস্ট-সরবরাহিত অবজেক্টগুলি অন্তর্ভুক্ত রয়েছে। উদাহরণস্বরূপ, জন্য স্পেসিফিকেশন NodeListথেকে querySelectorAllপুনরাবৃত্তির সমর্থন করার জন্য আপডেট করা হয়েছে। জন্য বৈশিষ্ট HTMLCollectionথেকে getElementsByTagNameছিল না।

  5. একটি পুনরাবৃত্তি স্পষ্টভাবে ব্যবহার করুন (ES2015 +)

    # 4 দেখুন।

একটি সত্য অ্যারে তৈরি করুন

অন্য সময়, আপনি কোনও অ্যারের মতো অবজেক্টটিকে সত্য অ্যারে রূপান্তর করতে চাইতে পারেন। এটি করা আশ্চর্যজনকভাবে সহজ:

  1. sliceঅ্যারে পদ্ধতিটি ব্যবহার করুন

    আমরা sliceঅ্যারে পদ্ধতিটি ব্যবহার করতে পারি , যা উপরে উল্লিখিত অন্যান্য পদ্ধতির মতো "ইচ্ছাকৃত জেনেরিক" এবং তাই অ্যারের মতো বস্তুগুলির সাথে এটি ব্যবহার করা যেতে পারে:

    var trueArray = Array.prototype.slice.call(arrayLikeObject);

    সুতরাং উদাহরণস্বরূপ, আমরা যদি NodeListএকটি সত্য অ্যারে রূপান্তর করতে চান , আমরা এটি করতে পারে:

    var divs = Array.prototype.slice.call(document.querySelectorAll("div"));

    দেখুন হোস্ট-প্রদান করা অবজেক্টের জন্য সতর্কীকরণ নিচে। বিশেষত, নোট করুন যে এটি আইই 8 এবং এর আগে ব্যর্থ হবে, যা আপনাকে হোস্ট-সরবরাহিত অবজেক্টগুলিকে এর মতো ব্যবহার করতে দেয় না this

  2. স্প্রেড সিনট্যাক্স ব্যবহার করুন ( ...)

    এই বৈশিষ্ট্যটি সমর্থন করে এমন জাভাস্ক্রিপ্ট ইঞ্জিনগুলির সাথে ES2015 এর স্প্রেড সিনট্যাক্স ব্যবহার করাও সম্ভব । যেমন for-of, এটি অবজেক্ট দ্বারা সরবরাহিত পুনরুক্তি ব্যবহার করে (পূর্ববর্তী বিভাগে # 4 দেখুন):

    var trueArray = [...iterableObject];

    সুতরাং উদাহরণস্বরূপ, আমরা যদি NodeListএকটি সত্য অ্যারে রূপান্তর করতে চান , স্প্রেড সিনট্যাক্স সহ এটি যথেষ্ট সংযোগযুক্ত হয়:

    var divs = [...document.querySelectorAll("div")];
  3. ব্যবহার Array.from

    Array.from (spec) | (MDN) (ES2015 +, তবে সহজেই পলিফিল্ড) একটি অ্যারের মতো অবজেক্ট থেকে একটি অ্যারে তৈরি করে optionচ্ছিকভাবে প্রথমে ম্যাপিং ফাংশনটির মাধ্যমে এন্ট্রিগুলি পাস করে। তাই:

    var divs = Array.from(document.querySelectorAll("div"));

    অথবা যদি আপনি প্রদত্ত শ্রেণীর সাথে উপাদানগুলির ট্যাগ নামের একটি অ্যারে পেতে চান, আপনি ম্যাপিং ফাংশনটি ব্যবহার করতে পারবেন:

    // Arrow function (ES2015):
    var divs = Array.from(document.querySelectorAll(".some-class"), element => element.tagName);
    
    // Standard function (since `Array.from` can be shimmed):
    var divs = Array.from(document.querySelectorAll(".some-class"), function(element) {
        return element.tagName;
    });

হোস্ট-সরবরাহিত অবজেক্টের জন্য ক্যাভেট

আপনি যদি হোস্ট-সরবরাহিত অ্যারে-জাতীয় বস্তুগুলির Array.prototypeসাথে ফাংশন ব্যবহার করেন (জাভাস্ক্রিপ্ট ইঞ্জিনের পরিবর্তে ব্রাউজারের সরবরাহিত ডিওএম তালিকা এবং অন্যান্য জিনিস), হোস্ট-সরবরাহিত বস্তুটি সঠিকভাবে আচরণ করে তা নিশ্চিত করার জন্য আপনার লক্ষ্য পরিবেশে পরীক্ষা করা নিশ্চিত হওয়া দরকার । বেশিরভাগই সঠিকভাবে আচরণ করে (এখন) তবে এটি পরীক্ষা করা গুরুত্বপূর্ণ। কারণটি হ'ল আপনি যে পদ্ধতিগুলি সম্ভবত ব্যবহার করতে চান সেগুলি বেশিরভাগ বিমূর্ত ক্রিয়াকলাপের একটি সৎ উত্তর দেওয়ার জন্য হোস্ট-সরবরাহিত বস্তুর উপর নির্ভর করে । এই লেখার হিসাবে, ব্রাউজারগুলি এটির একটি খুব ভাল কাজ করে তবে 5.1 বৈশিষ্টটি কোনও হোস্ট-সরবরাহিত বস্তুটি সততা না হওয়ার সম্ভাবনার পক্ষে অনুমতি দেয়। এটি §8.6.2 এর মধ্যে রয়েছে , বিভাগটির শুরুতে বড় টেবিলের নীচে বেশ কয়েকটি অনুচ্ছেদ), যেখানে এটি বলে:Array.prototype[[HasProperty]]

হোস্ট অবজেক্টগুলি অন্য কোনওভাবে নির্দিষ্ট না করে কোনওভাবেই এই অভ্যন্তরীণ পদ্ধতিগুলি প্রয়োগ করতে পারে; উদাহরণস্বরূপ, একটি সম্ভাবনা হ'ল [[Get]]এবং [[Put]]কোনও নির্দিষ্ট হোস্ট অবজেক্টের জন্য প্রকৃতপক্ষে সম্পত্তি মানগুলি সংগ্রহ এবং সঞ্চয় করা কিন্তু [[HasProperty]]সর্বদা মিথ্যা উত্পন্ন করে

(আমি ES2015 বৈশিষ্ট মধ্যে সমতুল্য শব্দবাহুল্য খুঁজে পাইনি, কিন্তু এটি এখনও মামলা হতে আবদ্ধ।) আবার, এই হিসাবে সাধারণ হোস্ট প্রদত্ত [আধুনিক ব্রাউজারে বস্তু অ্যারের মত লেখা NodeListউদাহরণস্বরূপ দৃষ্টান্ত,] কি হ্যান্ডেল [[HasProperty]]সঠিকভাবে, তবে এটি পরীক্ষা করা গুরুত্বপূর্ণ।)


44
আমি এটি যুক্ত করতে চাই যা .forEachদক্ষতার সাথে ভাঙা যায় না। বিরতি সম্পাদন করতে আপনাকে একটি ব্যতিক্রম ছুঁড়ে ফেলতে হবে।
পাইজুসন

82
@ পিয়াস: আপনি যদি লুপটি ভাঙতে চান তবে আপনি এটি ব্যবহার করতে পারেন some। (আমি অবিচ্ছিন্ন যার ফলে পছন্দের যেত forEachপাশাপাশি, কিন্তু তারা, উম, আমাকে জিজ্ঞাসা করা হয়নি ;-)।)
টি জে Crowder

6
@ টিজে ক্রাউডার সত্য, যদিও এটি এর প্রাথমিক উদ্দেশ্য নয় বলে এটি আরও বেশি কাজের মতো দেখাচ্ছে।
পাইজুসন 21

8
@ user889030: আপনার একটি দরকার , পরে k=0, না একটি ;। মনে রাখবেন, প্রোগ্রামিং অনেকগুলি বিষয়, যার মধ্যে একটির দিকে গভীর মনোযোগ ... :-)
টিজে ক্রাউডার

5
@ জিমবি: এটি উপরে আবৃত (এবং lengthকোনও পদ্ধতি নয়)। :-)
টিজে ক্রাউডার

512

দ্রষ্টব্য : এই উত্তরটি আশাহীনভাবে পুরানো। আরও আধুনিক পদ্ধতির জন্য, অ্যারেতে উপলব্ধ পদ্ধতিগুলি দেখুন । আগ্রহের পদ্ধতিগুলি হ'ল:

  • প্রতিটির জন্য, প্রত্যেকটির জন্য
  • মানচিত্র
  • ছাঁকনি
  • ফ্যাস্ শব্দ
  • হ্রাস করা
  • প্রতি
  • কিছু

জাভাস্ক্রিপ্টে একটি অ্যারের পুনরাবৃত্তি করার মানক উপায় হ'ল ভ্যানিলা- forলুপ:

var length = arr.length,
    element = null;
for (var i = 0; i < length; i++) {
  element = arr[i];
  // Do something with element
}

তবে দ্রষ্টব্য, আপনার কাছে যদি ঘন অ্যারে থাকে তবে এই পদ্ধতিরটি কেবল ভাল is যদি অ্যারে খুব কম হয়, তবে আপনি এই পদ্ধতির সাথে কর্মক্ষমতা সমস্যার মধ্যে দৌড়াতে পারেন, যেহেতু আপনি প্রচুর সূচকগুলিতে পুনরাবৃত্তি করবেন যা অ্যারেতে আসলে বিদ্যমান নেই exist এই ক্ষেত্রে, একটি- for .. inলুপটি আরও ভাল ধারণা হতে পারে।তবে আপনাকে অবশ্যই অ্যারের প্রয়োজনীয় কাঙ্ক্ষিত বৈশিষ্ট্যগুলি (অর্থাৎ অ্যারে উপাদানগুলি) কাজ করা হয়েছে তা নিশ্চিত করার জন্য আপনাকে অবশ্যই উপযুক্ত সুরক্ষার ব্যবস্থা ব্যবহার করতে হবে, যেহেতু for..in-লুপটি উত্তরাধিকার ব্রাউজারগুলিতেও গণনা করা হবে, বা অতিরিক্ত বৈশিষ্ট্য হিসাবে সংজ্ঞায়িত করা হয়েছে enumerable

ইন নাম ECMAScript 5 অ্যারের প্রোটোটাইপ উপর একটি foreach পদ্ধতি হতে হবে, কিন্তু এটি উত্তরাধিকার ব্রাউজারে সমর্থিত নয়। সুতরাং এটি অবিচ্ছিন্নভাবে ব্যবহার করতে সক্ষম হতে আপনার অবশ্যই এমন পরিবেশ থাকা উচিত যা এটি সমর্থন করে (উদাহরণস্বরূপ, সার্ভার সাইড জাভাস্ক্রিপ্টের জন্য নোড.জেএস ), অথবা একটি "পলিফিল" ব্যবহার করুন। এই কার্যকারিতার জন্য পলিফিল অবশ্য তুচ্ছ এবং যেহেতু কোডটি পড়া সহজ করে তোলে তাই এটি অন্তর্ভুক্ত করা ভাল পলফিল।


2
কেন for(instance in objArray) সঠিক ব্যবহার নয়? এটি আমার কাছে আরও সহজ লাগছে তবে আপনি শুনতে পাচ্ছেন যে আপনি এটির ব্যবহারের সঠিক উপায় হিসাবে না?
দান্তে 1986

21
আপনি ইনলাইন দৈর্ঘ্যের ক্যাচিং ব্যবহার করতে পারেন: এর জন্য (var i = 0, l = arrleleth; i <l; i ++)
রবার্ট হফম্যান

3
প্রথম লাইনের শেষে কমাটি ইচ্ছাকৃত, না এটি টাইপো (সেমিকোলন হতে পারে)?
মোহাম্মদ আবদুল মুজিব

6
@ ওয়ারধা-ওয়েব এটি ইচ্ছাকৃত। এটি আমাদের একক- varকীওয়ার্ড সহ একাধিক ভেরিয়েবল ঘোষণা করতে সক্ষম করে । যদি আমরা একটি সেমিকোলন ব্যবহার করতাম elementতবে বৈশ্বিক পরিসরে ঘোষণা করা হত (বা বরং জেএসহিন্ট এটি উত্পাদনে পৌঁছানোর আগেই আমাদের দিকে চেঁচিয়ে উঠত)।
প্যাট্রিক অ্যাকারস্ট্রান্ড

239

আপনি যদি jQuery লাইব্রেরি ব্যবহার করেন তবে আপনি jQuery.each ব্যবহার করতে পারেন :

$.each(yourArray, function(index, value) {
  // do your stuff here
});

সম্পাদনা:

প্রশ্ন অনুসারে, ব্যবহারকারীরা jquery এর পরিবর্তে জাভাস্ক্রিপ্টে কোড চান তাই সম্পাদনাটি

var length = yourArray.length;   
for (var i = 0; i < length; i++) {
  // Do something with yourArray[i].
}

2
আমি সম্ভবত এই উত্তরটি প্রায়শই ব্যবহার করতে যাচ্ছি। এটি প্রশ্নের সেরা উত্তর নয়, তবে বাস্তবে আমাদের কাছে jQuery ব্যবহার করা সবচেয়ে সহজ এবং সর্বাধিক প্রযোজ্য হতে চলেছে। আমার মনে হয় যদিও আমাদের সকলকে ভ্যানিলা পদ্ধতিটি শিখানো উচিত। আপনার বোঝার প্রসার ঘটাতে কখনই ব্যাথা লাগে না।
মপসাইড

47
কেবল এটির স্বার্থে: jQuery প্রতিটি হ'ল ধীরে ধীরে দেশীয় সমাধান। এটি সম্ভব হলে jQuery এর পরিবর্তে দেশীয় জাভাস্ক্রিপ্ট ব্যবহার করার পরামর্শ jQuery দ্বারা দেওয়া হয়। jsperf.com/browser-diet-jquery-each-vs-for-loop
কেভিন বস

8
আপনি যখন ভ্যানিলা জেএস ব্যবহার করতে পারেন তখন jQuery ব্যবহার থেকে বিরত থাকুন
Noe

2
স্ট্যান্ডার্ড জেএস
আটকে থাকুন,

116

পিছনে লুপ

আমি মনে করি লুপের বিপরীতটি এখানে উল্লেখের দাবি রাখে:

for (var i = array.length; i--; ) {
     // process array[i]
}

সুবিধাদি:

  • আপনাকে একটি অস্থায়ী lenপরিবর্তনশীল ঘোষণা করার প্রয়োজন হবে না বা array.lengthপ্রতিটি পুনরাবৃত্তির সাথে তুলনা করতে হবে, যার মধ্যে একটিও এক মিনিটের অনুকূলতা হতে পারে।
  • বিপরীত ক্রমে DOM থেকে ভাইবোনদের সরিয়ে ফেলা সাধারণত আরও কার্যকর । (ব্রাউজারটির অভ্যন্তরীণ অ্যারেগুলিতে উপাদানগুলির কম স্থানান্তর করা দরকার))
  • আপনি যদি অ্যারের পরিবর্তন যখন বা সূচক পর লুপিং আমি (উদাহরণস্বরূপ আপনি সরাতে বা একটি আইটেম সন্নিবেশ array[i]), তারপর একটা ফরওয়ার্ড লুপ আইটেম অবস্থানে বাম হাতে চলে এড়িয়ে যেতাম আমি , অথবা পুনরায় প্রক্রিয়া আমি তম আইটেমটি ছিল ডান স্থানান্তরিত। লুপ জন্য একটি ঐতিহ্যগত, আপনি পারে আপডেট আমি 1, কিন্তু কেবল দিক reversing এর পুনরাবৃত্তির প্রায়ই একটি হয় - পরবর্তী আইটেম যে চাহিদা প্রক্রিয়াকরণের নির্দেশ করার সহজ এবং আরো মার্জিত সমাধান
  • একইভাবে, নেস্টেড ডিওএম উপাদানগুলি সংশোধন বা অপসারণ করার সময় , বিপরীতে প্রক্রিয়াজাতকরণ ত্রুটিগুলি ঘটাতে পারে । উদাহরণস্বরূপ, বাচ্চাদের পরিচালনা করার আগে পিতামাতার নোডের অভ্যন্তরীণ এইচটিএমএলকে সংশোধন করার বিষয়টি বিবেচনা করুন। শিশু নোড পৌঁছানোর পরে এটি ডিওএম থেকে বিচ্ছিন্ন হয়ে যাবে, যখন পিতামাতার অন্তর্নিহিত এইচটিএমএল লেখা হয়েছিল তখন একটি নতুন তৈরি করা শিশু দ্বারা প্রতিস্থাপন করা হয়েছিল।
  • এটা খাটো টাইপ করতে, এবং পড়া , উপলব্ধ অন্যান্য অপশন কিছু নয়। যদিও এটি forEach()ES6 এর কাছে হারায় for ... of

অসুবিধা:

  • এটি বিপরীত ক্রমে আইটেমগুলি প্রক্রিয়া করে। যদি আপনি ফলাফলগুলি থেকে কোনও নতুন অ্যারে তৈরি করে বা স্ক্রিনে জিনিসগুলি মুদ্রণ করেন তবে স্বাভাবিকভাবেই আউটপুটটি বিপরীত হবে মূল ক্রমের সাথে সামঞ্জস্য হবে।
  • তাদের অর্ডার বজায় রাখতে বারবার ভাইবোনদের প্রথম সন্তানের হিসাবে ডিওমে inোকানো কম দক্ষ । (ব্রাউজারটি জিনিসগুলি ঠিকভাবে স্থানান্তরিত করতে থাকবে)) ডিওএম নোডগুলি দক্ষতার সাথে এবং ক্রমে তৈরি করতে কেবল সামনের দিকে লুপ করুন এবং স্বাভাবিক হিসাবে সংযোজন করুন (এবং একটি "নথির খণ্ড "ও ব্যবহার করুন)।
  • বিপরীত লুপ জুনিয়র বিকাশকারীদের বিভ্রান্ত করছে। (আপনার দৃষ্টিভঙ্গির উপর নির্ভর করে আপনি এটি একটি সুবিধা বিবেচনা করতে পারেন))

আমার সবসময় এটি ব্যবহার করা উচিত?

কিছু বিকাশকারী ডিফল্টরূপে লুপের জন্য বিপরীতটি ব্যবহার করে , যদি না আগাম লুপের কোনও ভাল কারণ থাকে।

যদিও পারফরম্যান্স লাভগুলি সাধারণত তুচ্ছ, এটি চিৎকারের ধরণের:

"তালিকার প্রতিটি আইটেমের জন্য কেবল এটি করুন, আমি অর্ডারটির কোনও যত্ন করি না!"

তবে অনুশীলন যে হয় না , মনে করো নির্ভরযোগ্য ইঙ্গিত আসলে যেহেতু সেই অনুষ্ঠান থেকে আলাদা করে চেনা হয় যখন আপনি কি করতে আদেশ সম্পর্কে যত্ন, এবং সত্যিই কি প্রয়োজন বিপরীত লুপ করতে। সুতরাং প্রকৃতপক্ষে "যত্ন করবেন না" অভিপ্রায়টি সঠিকভাবে প্রকাশ করার জন্য আরেকটি নির্মাণের প্রয়োজন হবে, বর্তমানে ইসিএমএসক্রিপ্ট সহ বেশিরভাগ ভাষায় অনুপলব্ধ কিছু, তবে যাকে বলা যেতে পারে, উদাহরণস্বরূপ forEachUnordered(),।

যদি অর্ডারটি কোনও ব্যাপার না, এবং দক্ষতা একটি উদ্বেগ (কোনও গেম বা অ্যানিমেশন ইঞ্জিনের অভ্যন্তরীণ লুপে) থাকে তবে লুপের জন্য বিপরীতটি আপনার যেতে-যাওয়া প্যাটার্ন হিসাবে গ্রহণযোগ্য হতে পারে। কেবল মনে রাখবেন যে বিদ্যমান কোডে লুপের জন্য একটি বিপরীতটি দেখার অর্থ এটি অর্ডার অপ্রাসঙ্গিক নয়!

প্রতিটি () এর জন্য ব্যবহার করা ভাল ছিল

সাধারণভাবে উচ্চ স্তরের কোডের জন্য যেখানে স্পষ্টতা এবং সুরক্ষা অধিক উদ্বেগ, আমি আগে Array::forEachলুপিংয়ের জন্য আপনার ডিফল্ট ধরণ হিসাবে ব্যবহার করার পরামর্শ দিয়েছিলাম (যদিও এই দিনগুলিতে আমি ব্যবহার করতে পছন্দ করি for..of)। forEachবিপরীত লুপের চেয়ে বেশি পছন্দ করার কারণগুলি হ'ল :

  • এটি পড়া পরিষ্কার।
  • এটি ইঙ্গিত দেয় যে আমি ব্লকের মধ্যে স্থানান্তরিত হচ্ছি না (যা সর্বদা দীর্ঘ forএবং whileলুপগুলিতে লুকানো সম্ভাব্য বিস্ময় )।
  • এটি আপনাকে বন্ধের জন্য একটি বিনামূল্যে সুযোগ দেয়।
  • এটি স্থানীয় ভেরিয়েবলের ফুটো এবং বহিরাগত ভেরিয়েবলগুলির সাথে দুর্ঘটনাজনিত সংঘর্ষ (এবং রূপান্তরকরণ) হ্রাস করে।

তারপরে আপনি যখন আপনার কোডটিতে লুপের জন্য বিপরীতটি দেখতে পান, এটি একটি ইঙ্গিত যে এটি কোনও ভাল কারণে (সম্ভবত উপরে বর্ণিত একটি কারণে) বিপরীত হয়েছে ed এবং লুপের জন্য একটি traditionalতিহ্যবাহী ফরোয়ার্ড দেখে বোঝা যায় যে স্থানান্তর হতে পারে।

(যদি অভিপ্রায় আলোচনাটি আপনার কোনও তাগিদ না করে তবে প্রোগ্রামিং স্টাইল এবং আপনার মস্তিষ্কে ক্রকফোর্ডের বক্তৃতাটি দেখে আপনি এবং আপনার কোড উপকার করতে পারেন may )

..এর জন্য ব্যবহার করা এখন আরও ভাল!

সেখানে কিনা বিষয়েও বিতর্ক হয় for..ofবা forEach()বাঞ্ছনীয় আছেন:

  • সর্বাধিক ব্রাউজার সমর্থনের জন্য, পুনরুক্তিকারীদের জন্য for..of পলিফিলের প্রয়োজন , এটি প্রয়োগ করতে আপনার অ্যাপ্লিকেশনটি সামান্য ধীর এবং ডাউনলোড করতে কিছুটা বড় making

  • যে কারণে (এবং ব্যবহার উৎসাহিত করার জন্য mapএবং filter), কিছু ফ্রন্ট-এন্ড শৈলী গাইড নিষিদ্ধ for..ofসম্পূর্ণরূপে!

  • তবে উপরোক্ত উদ্বেগগুলি নোড.জেএস অ্যাপ্লিকেশনগুলিতে প্রযোজ্য নয়, যেখানে for..ofএখন ভাল সমর্থন রয়েছে।

  • এবং তদ্ব্যতীত ভিতরে await কাজ করে নাforEach() । এই ক্ষেত্রে ব্যবহার করা for..ofহ'ল পরিষ্কার প্যাটার্ন

ব্যক্তিগতভাবে, আমি যা পড়ার পক্ষে সবচেয়ে সহজ মনে করি তা ব্যবহার করার ঝোঁক, যদি না পারফরম্যান্স বা সংশোধন একটি বড় উদ্বেগ না হয়ে থাকে। এই দিন তাই আমি ব্যবহার করতে পছন্দ for..ofপরিবর্তে forEach(), কিন্তু আমি সবসময় ব্যবহার করবে mapবা filterবা findবা someযখন প্রযোজ্য। (আমার সহকর্মীদের পক্ষে, আমি খুব কমই ব্যবহার করি reduce))


এটা কিভাবে কাজ করে?

for (var i = 0; i < array.length; i++) { ... }   // Forwards

for (var i = array.length; i--; )    { ... }   // Reverse

আপনি লক্ষ্য করবেন যে i--এটি মধ্যম ধারা (যেখানে আমরা সাধারণত তুলনা দেখতে পাই) এবং শেষ ধারাটি খালি (যেখানে আমরা সাধারণত দেখি i++)। এর অর্থ এটি ধারাবাহিকতার শর্তi-- হিসাবেও ব্যবহৃত হয় । গুরুতরভাবে, এটি কার্যকর করা হয় এবং প্রতিটি পুনরাবৃত্তির আগে পরীক্ষা করা হয় ।

  • কীভাবে array.lengthএটি বিস্ফোরিত না করে শুরু হতে পারে ?

    কারণ i--রানে আগে প্রতিটি পুনরাবৃত্তির, প্রথম পুনরাবৃত্তির উপর আমরা আসলে এক্সটেনশানটিকে অ্যাক্সেস করা হবে array.length - 1, যা দিয়ে কোনো সমস্যা এড়াতে অ্যারে-আউট-অফ-সীমা undefined আইটেম।

  • কেন এটি সূচক 0 এর আগে পুনরাবৃত্তি থামছে না?

    যখন শর্তটি i--একটি মিথ্যা মানকে মূল্যায়ণ করে (যখন এটি 0 দেয়) লুপটি পুনরাবৃত্তি বন্ধ করে দেয়।

    কৌশলটি হ'ল বিপরীতভাবে --i, অনুসরণকারী i--অপারেটর হ্রাস পায় iতবে হ্রাসের আগে মান দেয় yield আপনার কনসোল এটি প্রদর্শন করতে পারে:

    > var i = 5; [i, i--, i];

    [5, 5, 4]

    চূড়ান্ত পুনরাবৃত্তির ক্ষেত্রে, আমি আগে 1 ছিল এবং i--এক্সপ্রেশনটি 0 তে পরিবর্তিত হয় তবে বাস্তবে 1 (সত্যবাদী) পাওয়া যায়, এবং শর্তটি পাস হয়। পরবর্তী পুনরাবৃত্তির পরে আমি -1 এi-- পরিবর্তিত হয় তবে 0 (মিথ্যা) পাওয়া যায়, ফলে মৃত্যুদণ্ড কার্যকর হওয়ার সাথে সাথে লুপের নীচের অংশ থেকে বাদ পড়ে।

    লুপের জন্য traditionalতিহ্যবাহী ফরোয়ার্ডগুলিতে i++এবং ++iবিনিময়যোগ্য (ডগলাস ক্রকফোর্ড পয়েন্ট হিসাবে)। তবে লুপের বিপরীতে, কারণ আমাদের হ্রাসও আমাদের শর্তের বহিঃপ্রকাশ, তাই আমরা i--সূচি 0 তে আইটেমটি প্রক্রিয়া করতে চাইলে অবশ্যই আমাদের আটকে থাকতে হবে ।


তুচ্ছ বস্তু

কিছু লোক বিপরীত forলুপে কিছুটা তীর আঁকতে পছন্দ করে এবং একটি চোখের পলক দিয়ে শেষ করে:

for (var i = array.length; i --> 0 ;) {

লুপের জন্য বিপরীতগুলির সুবিধাগুলি এবং ভয়াবহতা দেখানোর জন্য ক্রেডিটগুলি ডাব্লুওয়াইএলে যায়।


3
আমি মানদণ্ড যুক্ত করতে ভুলে গেছি । আমি 6202 এর মতো 8-বিট প্রসেসরের বিপরীত লুপিং কীভাবে একটি তাত্পর্যপূর্ণ অপ্টিমাইজেশন তা উল্লেখ করতে ভুলে গেছি, যেখানে আপনি সত্যিই বিনামূল্যে তুলনাটি পাবেন!
জোয়েটউইল

একই উত্তরটি এখানে আরও সংক্ষিপ্তভাবে দেওয়া হয়েছে (ভিন্ন প্রশ্নে)।
জোয়েটউইডল

84

কিছু সি স্টাইল ভাষা foreachগণনার মাধ্যমে লুপ করতে ব্যবহার করে। জাভাস্ক্রিপ্টে এটি for..inলুপ কাঠামোর সাহায্যে করা হয় :

var index,
    value;
for (index in obj) {
    value = obj[index];
}

একটি ধরা আছে। for..inবস্তুর প্রতিটি অগণিত সদস্য এবং তার প্রোটোটাইপের সদস্যদের মধ্য দিয়ে লুপ করবে। অবজেক্টের প্রোটোটাইপের মাধ্যমে উত্তরাধিকার সূত্রে প্রাপ্ত মানগুলি এড়াতে কেবল সম্পত্তিটি বস্তুর মালিক কিনা তা পরীক্ষা করে দেখুন:

for (i in obj) {
    if (obj.hasOwnProperty(i)) {
        //do stuff
    }
}

অতিরিক্তভাবে, ইসমাস্ক্রিপ্ট 5 একটি forEachপদ্ধতি যুক্ত করেছে Array.prototypeযা ক্যালব্যাক ব্যবহার করে অ্যারের উপরে গণনা করতে ব্যবহার করা যেতে পারে (পলিফিলটি ডক্সে রয়েছে যাতে আপনি এখনও এটি পুরানো ব্রাউজারগুলির জন্য ব্যবহার করতে পারেন):

arr.forEach(function (val, index, theArray) {
    //do stuff
});

Array.prototype.forEachকলব্যাক ফিরে এলে তা ভাঙবে না তা লক্ষ করা গুরুত্বপূর্ণ false। শর্ট সার্কিটযুক্ত লুপগুলি সরবরাহ করতে jQuery এবং অ্যান্ডসোর.জেগুলি তাদের নিজস্ব প্রকারের সরবরাহ করে each


3
সুতরাং কীভাবে একটি ECMAScript5 পূর্বাভঙ্গ লুপটি ভেঙে যায় যেমন আমরা লুপের জন্য একটি সাধারণ বা সি-স্টাইলের ভাষাগুলির মতো একটি ফোরচ লুপ চাই?
Ciaran গ্যালাগার

5
@ কায়ারাঞ্জ, জাভাস্ক্রিপ্টে এমন eachপদ্ধতিগুলি দেখা সাধারণ বিষয় return falseযা লুপটি ভেঙে ফেলার জন্য ব্যবহার করতে দেয় তবে forEachএটি কোনও বিকল্প নয়। একটি বাহ্যিক পতাকা ব্যবহার করা যেতে পারে (যেমন if (flag) return;, তবে এটি কেবলমাত্র ফাংশন বাকী অংশটি কার্যকর করা থেকে আটকাতে পারে, forEachতবুও পুরো সংগ্রহটি পুনরাবৃত্তি করতে থাকবে
zzzzBov

43

আপনি যদি কোনও অ্যারের উপরে লুপ করতে চান তবে প্রমিত তিন ভাগের forলুপটি ব্যবহার করুন ।

for (var i = 0; i < myArray.length; i++) {
    var arrayItem = myArray[i];
}

আপনি এর myArray.lengthপিছনে পিছনে ক্যাশে বা পুনরাবৃত্তি করে কিছু কর্মক্ষমতা অপ্টিমাইজেশন পেতে পারেন ।


6
(var i = 0, দৈর্ঘ্য = আমারআরএই দৈর্ঘ্য; i <দৈর্ঘ্য; i ++) এর জন্য এটি করা উচিত
এডসন মদিনা

5
@EdsonMedina যে একটি নতুন বিশ্বব্যাপী পরিবর্তনশীল নামক তৈরি করবে length। ;)
জোয়েটউইডল

4
@ জোয়েটউইল হ্যাঁ, তবে এটি এই পোস্টের আওতার বাইরে। আপনি যাইহোক আমি একটি বৈশ্বিক পরিবর্তনশীল তৈরি করব।
এডসন মদিনা

6
@ এডসনমেদিনা আমার ক্ষমা চাই, আমার এটি সম্পূর্ণ ভুল ছিল। ব্যবহার ,একটি কাজ পরে নেই না , একটি নতুন বৈশ্বিক পরিচয় করিয়ে তাই আপনার পরামর্শের ঠিক হয় জরিমানা ! আমি এটি একটি ভিন্ন সমস্যার জন্য বিভ্রান্ত করছি: =একটি অ্যাসাইনমেন্টের পরে ব্যবহার করা একটি নতুন গ্লোবাল তৈরি করে
জোয়েটউইডল

সাবধানে পরিবর্তনশীল আমি লুপ স্থানীয় নয় । জাভাস্ক্রিপ্টের ব্লক স্কোপ নেই। var i, length, arrayItem;এই ভুল বোঝাবুঝি এড়াতে লুপের আগে ঘোষণা করা ভাল ।
জেমস

35

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

angular.forEach2 টি আর্গুমেন্ট এবং একটি thirdচ্ছিক তৃতীয় যুক্তি লাগে takes প্রথম আর্গুমেন্টটি পুনরাবৃত্তি করার জন্য অবজেক্ট (অ্যারে), দ্বিতীয় আর্গুমেন্টটি পুনরুক্তি ফাংশন, এবং thirdচ্ছিক তৃতীয় আর্গুমেন্টটি অবজেক্ট কনটেক্সট (মূলত লুপটির অভ্যন্তরে 'এটি' হিসাবে উল্লেখ করা হয়)।

কৌণিকতার forEach লুপটি ব্যবহার করার বিভিন্ন উপায় রয়েছে। সবচেয়ে সহজ এবং সম্ভবত সবচেয়ে ব্যবহৃত হয়

var temp = [1, 2, 3];
angular.forEach(temp, function(item) {
    //item will be each element in the array
    //do something
});

একটি অ্যারে থেকে অন্য অ্যারেতে আইটেম অনুলিপি করার জন্য দরকারী আরেকটি উপায়

var temp = [1, 2, 3];
var temp2 = [];
angular.forEach(temp, function(item) {
    this.push(item); //"this" refers to the array passed into the optional third parameter so, in this case, temp2.
}, temp2);

যদিও আপনাকে এটি করতে হবে না, আপনি কেবল নিম্নলিখিতটি করতে পারেন এবং এটি পূর্ববর্তী উদাহরণের সমতুল্য:

angular.forEach(temp, function(item) {
    temp2.push(item);
});

angular.forEachভ্যানিলা-স্বাদযুক্ত লুপটির বিপরীতে ফাংশনটি ব্যবহার করার পক্ষে এখন কার্যকারিতা এবং বিধিগুলি রয়েছে for

পেশাদাররা

  • সহজ পাঠযোগ্যতা
  • সহজ লিখনযোগ্যতা
  • যদি উপলভ্য থাকে angular.forEachতবে প্রতিটি লুপের জন্য ES5 ব্যবহার করবে। এখন, আমি কনস বিভাগে দক্ষতা অর্জন করব, কারণ forEach লুপগুলি লুপগুলির চেয়ে অনেক ধীর। আমি এটি প্রো হিসাবে উল্লেখ করেছি কারণ এটি ধারাবাহিক এবং মানক হওয়া ভাল।

নিম্নলিখিত 2 নেস্ট করা লুপগুলি বিবেচনা করুন, যা ঠিক একই জিনিসটি করে। ধরা যাক যে আমাদের কাছে দুটি অ্যারে অবজেক্ট রয়েছে এবং প্রতিটি বস্তুর মধ্যে ফলাফলের একটি অ্যারে রয়েছে যার প্রতিটির একটি স্ট্রিং (বা যাই হোক না কেন) এর একটি মান সম্পত্তি থাকে। এবং আসুন আমরা আমাদের ফলাফলগুলির প্রত্যেকটির পুনরাবৃত্তি করতে হবে এবং যদি সেগুলি সমান হয় তবে কিছু পদক্ষেপ নিন:

angular.forEach(obj1.results, function(result1) {
    angular.forEach(obj2.results, function(result2) {
        if (result1.Value === result2.Value) {
            //do something
        }
    });
});

//exact same with a for loop
for (var i = 0; i < obj1.results.length; i++) {
    for (var j = 0; j < obj2.results.length; j++) {
        if (obj1.results[i].Value === obj2.results[j].Value) {
            //do something
        }
    }
}

নিশ্চিত যে এটি একটি খুব সাধারণ অনুমানমূলক উদাহরণ, তবে আমি দ্বিতীয় পদ্ধতির সাহায্যে লুপগুলির জন্য এম্বেড ট্রিপল লিখেছি এবং এটি পড়তে এবং পড়তে খুব কঠিন হয়েছিল ।

কনস

  • দক্ষতা. angular.forEach, এবং নেটিভ forEach, এই বিষয়টির জন্য, উভয়ই স্বাভাবিক লুপের চেয়ে খুব ধীরে for.... প্রায় 90% ধীর । সুতরাং বড় ডেটা সেটগুলির জন্য, দেশীয় forলুপকে আটকে রাখা ভাল ।
  • কোন বিরতি, চালিয়ে যাওয়া, বা সমর্থন ফিরে না। continueআসলে " দুর্ঘটনা " দ্বারা সমর্থিত , সাধারণভাবে চালিয়ে যাওয়ার জন্য ফাংশনে এমন angular.forEachএকটি return;বিবৃতি রাখুন angular.forEach(array, function(item) { if (someConditionIsTrue) return; });যার ফলে এটি পুনরাবৃত্তির জন্য ক্রিয়াকলাপের বাইরে চলে যেতে পারে। এটি নেটিভ forEachবিরতি সমর্থন করে না হয় চালিয়ে যায় না এই কারণেও এটি ঘটে ।

আমি নিশ্চিত যে অন্যান্য বিভিন্ন উপকারিতাও রয়েছে, এবং দয়া করে আপনার উপযুক্ত add আমি অনুভব করি যে, নীচের অংশটি যদি আপনার দক্ষতার প্রয়োজন হয় তবে forআপনার লুপিংয়ের প্রয়োজনের জন্য কেবল নেটিভ লুপটি বদ্ধ থাকুন। তবে, যদি আপনার ডেটাসেটগুলি ছোট হয় এবং কিছু দক্ষতা পঠনযোগ্যতা এবং লিখনযোগ্যতার বিনিময়ে হাল ছেড়ে দেওয়া ঠিক হয়, তবে angular.forEachসেই খারাপ ছেলের মধ্যে কোনওভাবেই তা ফেলে দিন ।


34

আপনি অ্যারে খালি করতে আপত্তি না থাকলে:

var x;

while(x = y.pop()){ 

    alert(x); //do something 

}

xএর সর্বশেষ মানটি থাকবে yএবং এটি অ্যারে থেকে সরানো হবে। আপনি shift()যেটি প্রথম আইটেমটি দিতে এবং সরিয়ে দেবে তাও ব্যবহার করতে পারেন y


4
আপনার মতো বিরল অ্যারের মতো হয়ে থাকলে এটি কাজ করে না [1, 2, undefined, 3]
এম। গ্রিজিওয়াকজেউস্কি

2
... বা সত্যই মিথ্যা কিছু: [1, 2, 0, 3]বা[true, true, false, true]
জোয়েটউইডল

31

একটি foreach বাস্তবায়ন ( jsFiddle মধ্যে দেখতে ):

function forEach(list,callback) {
  var length = list.length;
  for (var n = 0; n < length; n++) {
    callback.call(list[n]);
  }
}

var myArray = ['hello','world'];

forEach(
  myArray,
  function(){
    alert(this); // do something
  }
);

2
এটির পুনরুক্তিকারী একটি অপ্রয়োজনীয় দৈর্ঘ্যের গণনা করছে। আদর্শ ক্ষেত্রে তালিকার দৈর্ঘ্যটি একবারে গণনা করা উচিত।
মিঘুন কৃষ্ণ

2
@ মিধুনকৃষ্ণ আমি আমার উত্তর এবং জেএসফিডেল আপডেট করেছি তবে সচেতন হন যে এটি আপনার মত সহজ নয়। এই প্রশ্নটি দেখুন
nmoliveira

2
সম্পূর্ণ এবং সঠিক প্রয়োগটি এখানে পাওয়া যাবে: developer.mozilla.org/en-US/docs/Web/
JavaScript

29

সম্ভবত for(i = 0; i < array.length; i++)লুপটি সেরা পছন্দ নয়। কেন? আপনার যদি এটি থাকে:

var array = new Array();
array[1] = "Hello";
array[7] = "World";
array[11] = "!";

পদ্ধতি থেকে আহবান করবে array[0]করার array[2]। প্রথমত, এটি প্রথমে আপনার কাছে এমনকি রেফারেন্স ভেরিয়েবলগুলি দেবে, দ্বিতীয়টি আপনার অ্যারেতে ভেরিয়েবলগুলি রাখবে না এবং তৃতীয়টি কোডটি আরও সাহসী করবে। এখানে দেখুন, আমি এটি ব্যবহার করি:

for(var i in array){
    var el = array[i];
    //If you want 'i' to be INT just put parseInt(i)
    //Do something with el
}

এবং যদি আপনি এটি কোনও ফাংশন হতে চান তবে আপনি এটি করতে পারেন:

function foreach(array, call){
    for(var i in array){
        call(array[i]);
    }
}

যদি আপনি ব্রেক করতে চান তবে আরও যুক্তিযুক্ত:

function foreach(array, call){
    for(var i in array){
        if(call(array[i]) == false){
            break;
        }
    }
}

উদাহরণ:

foreach(array, function(el){
    if(el != "!"){
        console.log(el);
    } else {
        console.log(el+"!!");
    }
});

এটি ফিরে আসে:

//Hello
//World
//!!!

29

সেখানে তিন বাস্তবায়নের হয় foreachমধ্যে jQuery এর হিসাবে অনুসরণ করে।

var a = [3,2];

$(a).each(function(){console.log(this.valueOf())}); //Method 1
$.each(a, function(){console.log(this.valueOf())}); //Method 2
$.each($(a), function(){console.log(this.valueOf())}); //Method 3

2
কনসোল লগ শুধুমাত্র ডেমো জন্য। এটি এটিকে একটি চলমান উদাহরণ হিসাবে তৈরি করা।
রাজেশ পল

29

ECMAScript 6 হিসাবে:

list = [0, 1, 2, 3]
for (let obj of list) {
    console.log(obj)
}

যেখানে ofসম্পর্কিত বৈষম্যগুলি এড়িয়ে চলে inএবং এটিকে forঅন্য কোনও ভাষার লুপের মতো কাজ করে এবং letআবদ্ধ করেi লুপের মতো কাজ করে এবং ফাংশনটির বিপরীতে লুপের করে।

{}কেবলমাত্র একটি আদেশ (উদাহরণস্বরূপ উপরের উদাহরণে) থাকলে ব্রেসগুলি ( ) বাদ দেওয়া যায়।


28

আন্ডারস্কোর.জে s এর লাইব্রেরিটি ব্যবহার করা এখন একটি সহজ সমাধান । এটি অনেক দরকারী সরঞ্জাম সরবরাহ করে, যেমন eachএবং স্বয়ংক্রিয়ভাবে কাজটি স্থানীয়কে অর্পণ করেforEach যদি উপলভ্য ।

এটি কীভাবে কাজ করে তার একটি কোডপেন উদাহরণ :

var arr = ["elemA", "elemB", "elemC"];
_.each(arr, function(elem, index, ar)
{
...
});

আরো দেখুন


23

for eachনেটিভ জাভাস্ক্রিপ্টে কোনও লুপ নেই । আপনি এই কার্যকারিতাটি পেতে লাইব্রেরিগুলি ব্যবহার করতে পারেন (আমি অ্যান্ডস্কোর.জেএস এর প্রস্তাব দিই ), একটি forলুপে একটি সরল ব্যবহার করুন ।

for (var instance in objects) {
   ...
}

তবে খেয়াল করুন যে একটি এমনকি সরল forলুপ ব্যবহার করার কারণ থাকতে পারে (স্ট্যাক ওভারফ্লো প্রশ্ন দেখুন অ্যারে পুনরাবৃত্তি এমন খারাপ ধারণা সহ "কেন" ইন "ব্যবহার করছেন? )

var instance;
for (var i=0; i < objects.length; i++) {
    var instance = objects[i];
    ...
}

22

এটি নন-স্পার্স তালিকার জন্য একটি পুনরাবৃত্তকারী যেখানে সূচকটি 0 থেকে শুরু হয়, যা ডকুমেন্ট.জেট এলিমেন্টস বাইট্যাগনাম বা ডকুমেন্ট.কোরিসিলিটরআল) এর সাথে কাজ করার সময় সাধারণ দৃশ্য)

function each( fn, data ) {

    if(typeof fn == 'string')
        eval('fn = function(data, i){' + fn + '}');

    for(var i=0, L=this.length; i < L; i++) 
        fn.call( this[i], data, i );   

    return this;
}

Array.prototype.each = each;  

ব্যবহারের উদাহরণ:

উদাহরণ # 1

var arr = [];
[1, 2, 3].each( function(a){ a.push( this * this}, arr);
arr = [1, 4, 9]

উদাহরণ # 2

each.call(document.getElementsByTagName('p'), "this.className = data;",'blue');

প্রতিটি পি ট্যাগ পায় class="blue"

উদাহরণ # 3

each.call(document.getElementsByTagName('p'), 
    "if( i % 2 == 0) this.className = data;",
    'red'
);

অন্যান্য প্রতিটি পি ট্যাগ পায় class="red" >

উদাহরণ # 4

each.call(document.querySelectorAll('p.blue'), 
    function(newClass, i) {
        if( i < 20 )
            this.className = newClass;
    }, 'green'
);

এবং অবশেষে প্রথম 20 টি নীল পি ট্যাগ সবুজ করে দেওয়া হয়েছে

স্ট্রিংটিকে ফাংশন হিসাবে ব্যবহার করার সময় সতর্কতা: ফাংশনটি প্রসঙ্গের বাইরে তৈরি হয় এবং কেবলমাত্র যেখানে আপনার পরিবর্তনশীল স্কোপিংয়ের বিষয়ে নিশ্চিত তা ব্যবহার করা উচিত। অন্যথায়, স্কোপিং আরও স্বজ্ঞাত যেখানে ফাংশনগুলি উত্তীর্ণ করা আরও ভাল।


21

আছে কয়েকটি উপায় হিসাবে নীচের, জাভাস্ক্রিপ্ট মধ্যে একটি অ্যারের মাধ্যেমে লুপ করতে:

জন্য - এটি সবচেয়ে সাধারণ এক । লুপিংয়ের জন্য কোডের সম্পূর্ণ ব্লক

var languages = ["Java", "JavaScript", "C#", "Python"];
var i, len, text;
for (i = 0, len = languages.length, text = ""; i < len; i++) {
    text += languages[i] + "<br>";
}
document.getElementById("example").innerHTML = text;
<p id="example"></p>

যখন - লুপটি যখন একটি শর্তটি হয়। এটি দ্রুততম লুপ বলে মনে হচ্ছে

var text = "";
var i = 0;
while (i < 10) {
    text +=  i + ") something<br>";
    i++;
}
document.getElementById("example").innerHTML = text;
<p id="example"></p>

do / while - কন্ডিশনটি সত্য হওয়ার সময় কোনও ব্লকের কোডের মধ্য দিয়ে লুপ হয়, কমপক্ষে একবারে চলবে

var text = ""
var i = 0;

do {
    text += i + ") something <br>";
    i++;
}
while (i < 10);

document.getElementById("example").innerHTML = text;
<p id="example"></p>

প্রায়োগিক লুপ - forEach, map, filter, এছাড়াও reduce(ফাংশন মাধ্যমে তারা লুপ, কিন্তু তারা ব্যবহার করা হয় যদি আপনি আপনার অ্যারের, ইত্যাদি সঙ্গে কিছু করতে হবে

// For example, in this case we loop through the number and double them up using the map function
var numbers = [65, 44, 12, 4];
document.getElementById("example").innerHTML = numbers.map(function(num){return num * 2});
<p id="example"></p>

অ্যারেগুলিতে ফাংশনাল প্রোগ্রামিং সম্পর্কে আরও তথ্য এবং উদাহরণগুলির জন্য, জাভাস্ক্রিপ্টে ফাংশনাল প্রোগ্রামিং: ব্লগ পোস্টটি দেখুন : মানচিত্র, ফিল্টার করুন এবং হ্রাস করুন


ছোট সংশোধন: forEachএটি "কার্যকরী" লুপ নয় যেহেতু এটি কোনও নতুন ফেরত দেয় না Array(আসলে এটি কোনও কিছুই ফেরায় না), এটি কেবল পুনরাবৃত্তি করে।
নিকোলাসউমিন

19

অ্যারের সাথে কাজ করতে ECMAScript 5 (জাভাস্ক্রিপ্টের সংস্করণ):

ফরইচ - অ্যারের প্রতিটি আইটেমের মাধ্যমে আইট্রেট করে এবং প্রতিটি আইটেমের সাথে আপনার যা প্রয়োজন তা করুন।

['C', 'D', 'E'].forEach(function(element, index) {
  console.log(element + " is #" + (index+1) + " in the musical scale");
});

// Output
// C is the #1 in musical scale
// D is the #2 in musical scale
// E is the #3 in musical scale

সেক্ষেত্রে কিছু ইনবিল্ট বৈশিষ্ট্য ব্যবহার করে অ্যারেতে অপারেশনে আরও আগ্রহী।

মানচিত্র - এটি কলব্যাক ফাংশনের ফলাফল সহ একটি নতুন অ্যারে তৈরি করে। আপনার অ্যারের উপাদানগুলি ফর্ম্যাট করার দরকার হলে এই পদ্ধতিটি ব্যবহার করা ভাল।

// Let's upper case the items in the array
['bob', 'joe', 'jen'].map(function(elem) {
  return elem.toUpperCase();
});

// Output: ['BOB', 'JOE', 'JEN']

হ্রাস করুন - নাম যেমন বলেছে, প্রদত্ত ফাংশনটিকে বর্তমান উপাদানটিতে পাস করার মাধ্যমে এবং পূর্ববর্তী সম্পাদনের ফলাফলকে কল করে এটি একক মানকে অ্যারে হ্রাস করে।

[1,2,3,4].reduce(function(previous, current) {
  return previous + current;
});
// Output: 10
// 1st iteration: previous=1, current=2 => result=3
// 2nd iteration: previous=3, current=3 => result=6
// 3rd iteration: previous=6, current=4 => result=10

প্রতিটি - অ্যারেতে থাকা সমস্ত উপাদান কলব্যাক ফাংশনে পরীক্ষায় উত্তীর্ণ হলে সত্য বা মিথ্যা প্রত্যাবর্তন করে।

// Check if everybody has 18 years old of more.
var ages = [30, 43, 18, 5];
ages.every(function(elem) {
  return elem >= 18;
});

// Output: false

ফিল্টার - ফিল্টার বাদে অন্যগুলির সাথে একেবারে অনুরূপ যে ফিল্টার প্রদত্ত ফাংশনে সত্য ফিরে আসে এমন উপাদানগুলির সাথে একটি অ্যারে প্রদান করে।

// Finding the even numbers
[1,2,3,4,5,6].filter(function(elem){
  return (elem % 2 == 0)
});

// Output: [2,4,6]

16

ভাঙ্গার কোনও অন্তর্নিহিত ক্ষমতা নেই forEach। ফাঁসি কার্যকর করতে বাধা Array#someদিতে নীচের মত ব্যবহার করুন :

[1,2,3].some(function(number) {
    return number === 1;
});

এটি কাজ করে কারণ someঅ্যারে ক্রমে মৃত্যুদণ্ডপ্রাপ্ত কলব্যাকগুলির মধ্যে যত তাড়াতাড়ি সত্য প্রত্যাবর্তন ঘটে, বাকীটির কার্য সম্পাদনকে সংক্ষিপ্ত-সার্কিট করে সত্য করে তোলে। মূল উত্তর জন্য দেখুন এরে প্রোটোটাইপ কিছু


13

আমি এটিকে বিপরীত লুপের সংমিশ্রণ এবং উপরের একটি উত্তর হিসাবে যুক্ত করতে চাই যে এই সিনট্যাক্সটিও পছন্দ করতে পারে।

var foo = [object,object,object];
for (var i = foo.length, item; item = foo[--i];) {
    console.log(item);
}

পেশাদাররা:

এর জন্য সুবিধা: আপনার মতো রেফারেন্সটি ইতিমধ্যে ইতিমধ্যে অন্য লাইনের সাথে ঘোষণার প্রয়োজন হবে না। অবজেক্ট অ্যারের লুপিংয়ের সময় এটি কার্যকর।

কনস:

রেফারেন্সটি মিথ্যা - মিথ্যা (অপরিবর্তিত ইত্যাদি) যখনই এটি ভেঙে যাবে। এটি যদিও সুবিধা হিসাবে ব্যবহার করা যেতে পারে। তবে এটি পড়ার জন্য এটি কিছুটা কঠিন করে তুলবে। এবং এছাড়াও ব্রাউজারের উপর নির্ভর করে এটি মূলটির চেয়ে দ্রুত কাজ করতে "না" অনুকূলিত হতে পারে।


12

jQuery উপায় ব্যবহার $.map:

var data = [1, 2, 3, 4, 5, 6, 7];

var newData = $.map(data, function(element) {
    if (element % 2 == 0) {
        return element;
    }
});

// newData = [2, 4, 6];

1
আমি মনে করি আউটপুটটি বেশি হওয়ার সম্ভাবনা রয়েছে [undefined, 2, undefined, 4, undefined, 6, undefined]

10

ECMAScript 6 ডিস্ট্রাকচারিং এবং স্প্রেড অপারেটরের সাথে লুপগুলি ব্যবহার করা

ECMAScript 6 এ আগত অপারেটরটি তৈরি এবং ব্যবহার করা নতুনদের পক্ষে আরও বেশি মানব-পঠনযোগ্য / নান্দনিক হিসাবে প্রমাণিত হয়েছে, যদিও কিছু জাভাস্ক্রিপ্ট অভিজ্ঞরা এটিকে অগোছালো বিবেচনা করতে পারে। জুনিয়র বা অন্য কিছু লোক এটি দরকারী মনে হতে পারে।

নিম্নলিখিত উদাহরণগুলি for...ofবিবৃতি এবং .forEachপদ্ধতিটি ব্যবহার করবে ।

উদাহরণ 6, 7, এবং 8 মত কোন কার্মিক লুপ ব্যবহার করা যেতে পারে .map, .filter, .reduce, .sort, .every, .some। এই পদ্ধতিগুলি সম্পর্কে আরও তথ্যের জন্য অ্যারে অবজেক্টটি দেখুন

উদাহরণ 1: সাধারণ for...ofলুপ - এখানে কোন কৌশল নয়।

let arrSimple = ['a', 'b', 'c'];

for (let letter of arrSimple) {
  console.log(letter);
}

উদাহরণ 2: অক্ষরগুলিতে শব্দগুলি বিভক্ত করুন

let arrFruits = ['apple', 'orange', 'banana'];

for (let [firstLetter, ...restOfTheWord] of arrFruits) {
  // Create a shallow copy using the spread operator
  let [lastLetter] = [...restOfTheWord].reverse();
  console.log(firstLetter, lastLetter, restOfTheWord);
}

উদাহরণ 3: একটি keyএবং লুপিং ingvalue

// let arrSimple = ['a', 'b', 'c'];

// Instead of keeping an index in `i` as per example `for(let i = 0 ; i<arrSimple.length;i++)`
// this example will use a multi-dimensional array of the following format type:
// `arrWithIndex: [number, string][]`

let arrWithIndex = [
  [0, 'a'],
  [1, 'b'],
  [2, 'c'],
];

// Same thing can be achieved using `.map` method
// let arrWithIndex = arrSimple.map((i, idx) => [idx, i]);

// Same thing can be achieved using `Object.entries`
// NOTE: `Object.entries` method doesn't work on Internet Explorer  unless it's polyfilled
// let arrWithIndex = Object.entries(arrSimple);

for (let [key, value] of arrWithIndex) {
  console.log(key, value);
}

উদাহরণ 4: অবজেক্টের বৈশিষ্ট্যগুলি ইনলাইন পান

let arrWithObjects = [{
    name: 'Jon',
    age: 32
  },
  {
    name: 'Elise',
    age: 33
  }
];

for (let { name, age: aliasForAge } of arrWithObjects) {
  console.log(name, aliasForAge);
}

উদাহরণ 5: আপনার যা প্রয়োজন তার গভীর বস্তুর বৈশিষ্ট্য পান

let arrWithObjectsWithArr = [{
    name: 'Jon',
    age: 32,
    tags: ['driver', 'chef', 'jogger']
  },
  {
    name: 'Elise',
    age: 33,
    tags: ['best chef', 'singer', 'dancer']
  }
];

for (let { name, tags: [firstItemFromTags, ...restOfTags] } of arrWithObjectsWithArr) {
  console.log(name, firstItemFromTags, restOfTags);
}

উদাহরণ 6: হল উদাহরণ 3 সঙ্গে ব্যবহার.forEach

let arrWithIndex = [
  [0, 'a'],
  [1, 'b'],
  [2, 'c'],
];

// Not to be confused here, `forEachIndex` is the real index
// `mappedIndex` was created by "another user", so you can't really trust it

arrWithIndex.forEach(([mappedIndex, item], forEachIndex) => {
  console.log(forEachIndex, mappedIndex, item);
});

উদাহরণ 7: হল উদাহরণ 4 সাথে ব্যবহার.forEach

let arrWithObjects = [{
    name: 'Jon',
    age: 32
  },
  {
    name: 'Elise',
    age: 33
  }
];
// NOTE: Destructuring objects while using shorthand functions
// are required to be surrounded by parentheses
arrWithObjects.forEach( ({ name, age: aliasForAge }) => {
  console.log(name, aliasForAge)
});

উদাহরণ 8: হল উদাহরণ 5 সঙ্গে ব্যবহার.forEach

let arrWithObjectsWithArr = [{
    name: 'Jon',
    age: 32,
    tags: ['driver', 'chef', 'jogger']
  },
  {
    name: 'Elise',
    age: 33,
    tags: ['best chef', 'singer', 'dancer']
  }
];

arrWithObjectsWithArr.forEach(({
  name,
  tags: [firstItemFromTags, ...restOfTags]
}) => {
  console.log(name, firstItemFromTags, restOfTags);
});


7

আপনার ধারণার নিকটতম উপায় হ'ল ব্যবহার করা Array.forEach()যা কোনও ক্লোজার ফাংশন গ্রহণ করে যা অ্যারের প্রতিটি উপাদানের জন্য কার্যকর করা হবে।

myArray.forEach(
  (item) => {
    // Do something
    console.log(item);
  }
);

অন্য কার্যকর উপায়টি হ'ল Array.map()যা একই পদ্ধতিতে কাজ করে তবে এটি আপনি ফিরে আসা সমস্ত মানও গ্রহণ করে এবং এগুলি একটি নতুন অ্যারেতে ফেরত দেয় (প্রয়োজনীয়ভাবে প্রতিটি উপাদানকে একটি নতুনকে ম্যাপিং করে), এর মতো:

var myArray = [1, 2, 3];
myArray = myArray.map(
  (item) => {
    return item + 1;
  }
);

console.log(myArray); // [2, 3, 4]

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

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

আবার ভুল, মানচিত্র মূল অ্যারেতে সমস্ত আইটেম সংশোধন বা রূপান্তরিত করে না, আমি মানচিত্রটি মূল আইটেমের অনুলিপি দিয়ে কাজ করে জোর দিয়ে উত্তরে প্রস্তাবিত করেছি এবং সম্পাদনা করব , মূল অ্যারেটিকে কোনওভাবেই ছাড়েনি
জেসেস ফ্রাঙ্কো

7

আপনি প্রত্যেকের জন্য কল করতে পারেন:

forEachআপনার সরবরাহ করা অ্যারের উপরে পুনরাবৃত্তি হবে এবং প্রতিটি পুনরাবৃত্তির জন্য এটির থাকবে elementযা সেই পুনরাবৃত্তির মান ধারণ করে। আপনার যদি সূচকের প্রয়োজন হয় তবে আপনি iফরেক্সের জন্য কলব্যাক ফাংশনের দ্বিতীয় পরামিতি হিসাবে পাস করে বর্তমান সূচকটি পেতে পারেন ।

ফরচ মূলত একটি হাই অর্ডার ফাংশন, যা এর প্যারামিটার হিসাবে অন্য ফাংশন নেয়।

let theArray= [1,3,2];

theArray.forEach((element) => {
  // Use the element of the array
  console.log(element)
}

আউটপুট:

1
3
2

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

for (let i=0; i<theArray.length; i++) {
  console.log(i); // i will have the value of each index
}

6

আপনি যদি তীর ফাংশন দিয়ে কোনও অ্যারের অবজেক্টের মধ্য দিয়ে লুপ করতে চান:

let arr = [{name:'john', age:50}, {name:'clark', age:19}, {name:'mohan', age:26}];

arr.forEach((person)=>{
  console.log('I am ' + person.name + ' and I am ' + person.age + ' old');
})


6

ল্যাম্বদা সিনট্যাক্স সাধারণত 10 বা নীচে ইন্টারনেট এক্সপ্লোরারে কাজ করে না।

আমি সাধারণত ব্যবহার করি

[].forEach.call(arrayName,function(value,index){
    console.log("value of the looped element" + value);
    console.log("index of the looped element" + index);
});

আপনি যদি jQuery অনুরাগী হন এবং ইতিমধ্যে jQuery ফাইল চলমান থাকে তবে আপনার সূচি এবং মানের পরামিতিগুলির অবস্থানগুলি বিপরীত করা উচিত

$("#ul>li").each(function(**index, value**){
    console.log("value of the looped element" + value);
    console.log("index of the looped element" + index);
});

5

আপনার যদি বিশাল অ্যারে থাকে তবে আপনার iteratorsকিছু দক্ষতা অর্জন করতে হবে। Iterators নির্দিষ্ট জাভাস্ক্রিপ্ট সংগ্রহের একটি সম্পত্তি (যেমন Map, Set, String, Array)। এমনকি, হুডের নীচে for..ofব্যবহার করে iterator

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

পুনরাবৃত্তির nextপদ্ধতিতে কল করে আপনি বর্তমান আইটেমটি অ্যাক্সেস করতে পারেন । পরবর্তী পদ্ধতিটি valueবর্তমান আইটেমটির রিটার্ন প্রদান করবে এবং booleanআপনি যখন সংগ্রহের শেষে পৌঁছেছেন তখন একটি নির্দেশ করবে indicate নিম্নলিখিতটি অ্যারে থেকে একটি পুনরুক্তি তৈরির উদাহরণ is

আপনার নিয়মিত অ্যারেটিকে values()এই জাতীয় পদ্ধতি ব্যবহার করে পুনরুক্তিতে রূপান্তর করুন :

    const myArr = [2,3,4]

let it = myArr.values();

console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());

আপনি নিজের নিয়মিত অ্যারেটিকে পুনরায় এটির মাধ্যমে পুনরুক্তি করতে Symbol.iteratorপারেন:

const myArr = [2,3,4]

let it = myArr[Symbol.iterator]();

console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());

এছাড়াও আপনি আপনার নিয়মিত রুপান্তর করতে পারেন arrayএকটি থেকে iteratorভালো:

let myArr = [8, 10, 12];

function makeIterator(array) {
    var nextIndex = 0;
    
    return {
       next: function() {
           return nextIndex < array.length ?
               {value: array[nextIndex++], done: false} :
               {done: true};
       }
    };
};

var it = makeIterator(myArr);

console.log(it.next().value);   // {value: 8, done: false}
console.log(it.next().value);   // {value: 10, done: false}
console.log(it.next().value);   // {value: 12, done: false}
console.log(it.next().value);   // {value: undefined, done: true}

দ্রষ্টব্য :

  • Iteters প্রকৃতির ক্লান্তিহীন।
  • অবজেক্টগুলি iterableডিফল্টরূপে হয় না । সেক্ষেত্রে ব্যবহার করুন for..inকারণ মানগুলির পরিবর্তে এটি কীগুলির সাথে কাজ করে।

আপনি iteration protocol এখানে আরও পড়তে পারেন ।


5

আপনি যদি ব্যবহার করতে চান তবে forEach()এটি দেখতে দেখতে এমনটি হবে -

theArray.forEach ( element => {
    console.log(element);
});

আপনি যদি ব্যবহার করতে চান তবে for()এটি দেখতে দেখতে এমনটি হবে -

for(let idx = 0; idx < theArray.length; idx++){
    let element = theArray[idx];
    console.log(element);
}

4

নতুন আপডেট হওয়া বৈশিষ্ট্য ECMAScript 6 (ES6) এবং ECMAScript 2015 অনুসারে, আপনি লুপগুলি সহ নিম্নলিখিত বিকল্পগুলি ব্যবহার করতে পারেন:

লুপের জন্য

for(var i = 0; i < 5; i++){
  console.log(i);
}

// Output: 0,1,2,3,4

লুপের জন্য ...

let obj = {"a":1, "b":2}

for(let k in obj){
  console.log(k)
}

// Output: a,b

Array.forEach ()

let array = [1,2,3,4]

array.forEach((x) => {
  console.log(x);
})

// Output: 1,2,3,4

লুপের জন্য ...

let array = [1,2,3,4]

for(let x of array){
  console.log(x);
}

// Output: 1,2,3,4

লুপ যখন

let x = 0

while(x < 5){
  console.log(x)
  x++
}

// Output: 1,2,3,4

লুপের সময় কর ...

let x = 0

do{
  console.log(x)
  x++
}while(x < 5)

// Output: 1,2,3,4

4

কর্মক্ষমতা

আজ (2019-12-18) আমি আমার ম্যাকোস ভি 10.13.6 (উচ্চ সিয়েরা), ক্রোম ভি 79.0, সাফারি ভি 13.0.4 এবং ফায়ারফক্স ভি .0.০ (bit৪ বিট) - এ পরীক্ষামূলক পরীক্ষা করেছি - অপ্টিমাইজেশন সম্পর্কে সিদ্ধান্তে (এবং মাইক্রো-অপ্টিমাইজেশন যা সাধারণত কোডের সাথে এটি পরিচয় করিয়ে দেওয়ার মতো নয় কারণ সুবিধাটি কম, তবে কোড জটিলতা বৃদ্ধি পায়)।

  • দেখে মনে হচ্ছে traditional তিহ্যবাহীfor i ( এএ ) সমস্ত ব্রাউজারে দ্রুত কোড লিখতে ভাল পছন্দ।

  • অন্যান্য সমাধান, যেমন for-of( বিজ্ঞাপন ), সমস্ত গ্রুপ সি তে ... সাধারণত আ এর চেয়ে 2 - 10 (এবং আরও বেশি) বার ধীর হয় তবে ছোট অ্যারেগুলির জন্য এটি ব্যবহার করা ঠিক হবে - কোডের স্পষ্টতা বাড়ানোর জন্য the

  • n( আব, বিবি, বি ) এ ক্যাশেযুক্ত অ্যারের দৈর্ঘ্যের সাথে থাকা লুপগুলি কখনও কখনও দ্রুত হয়, কখনও কখনও তাও হয় না। সম্ভবত সংকলকগণ স্বয়ংক্রিয়ভাবে এই পরিস্থিতি সনাক্ত করে এবং ক্যাচিং পরিচয় করিয়ে দেয়। ক্যাশে এবং নো-ক্যাশে সংস্করণে (মধ্যে গতি পার্থক্য আ, Ba থেকে, বিডি ), সম্পর্কে ~ 1% মত পরিচয় করিয়ে তাই এটি দেখায় nএকটি হল মাইক্রো-অপ্টিমাইজেশান

  • i--লুপটি শেষ অ্যারে উপাদান থেকে শুরু হয় এর মতো সমাধান ( এসি, বিসি ) সাধারণত ফরোয়ার্ড সলিউশনগুলির তুলনায় 30% কম হয় - সম্ভবত কারণটি সিপিইউ মেমরি ক্যাশে কাজ করার উপায় - ফরোয়ার্ড মেমরি রিডিং সিপিইউ ক্যাশে করার জন্য আরও অনুকূল op এই জাতীয় সমাধানগুলি ব্যবহার না করার জন্য সুপারিশ করা হয়।

বিস্তারিত

পরীক্ষায় আমরা অ্যারে উপাদানের যোগফল গণনা করি। আমি ছোট অ্যারে (10 উপাদান) এবং বড় অ্যারে (1 এম উপাদান) এর জন্য একটি পরীক্ষা করি এবং তাদের তিনটি দলে বিভক্ত করি:

  • - forপরীক্ষা
  • - whileপরীক্ষা
  • সি - অন্যান্য / বিকল্প পদ্ধতি

ক্রস ব্রাউজারের ফলাফল

সমস্ত পরীক্ষিত ব্রাউজারগুলির ফলাফল

এখানে চিত্র বিবরণ লিখুনব্রাউজার **

10 টি উপাদান সহ অ্যারে

ক্রোমের জন্য ফলাফল। আপনি এখানে আপনার মেশিনে পরীক্ষা করতে পারেন ।

এখানে চিত্র বিবরণ লিখুন

1,000,000 উপাদান সহ অ্যারে

ক্রোমের জন্য ফলাফল। আপনি এখানে আপনার মেশিনে পরীক্ষা করতে পারেন

এখানে চিত্র বিবরণ লিখুন


4

সারসংক্ষেপ:

কোনও অ্যারের মাধ্যমে পুনরাবৃত্তি করার সময় আমরা প্রায়শই নিম্নলিখিত লক্ষ্যগুলির মধ্যে একটি অর্জন করতে চাই:

  1. আমরা অ্যারের উপরে পুনরাবৃত্তি করতে এবং একটি নতুন অ্যারে তৈরি করতে চাই:

    Array.prototype.map

  2. আমরা অ্যারের উপরে পুনরাবৃত্তি করতে চাই এবং একটি নতুন অ্যারে তৈরি করব না:

    Array.prototype.forEach

    for..of লুপ

জাভাস্ক্রিপ্টে, এই দুটি লক্ষ্য অর্জনের অনেকগুলি উপায় রয়েছে। তবে কিছু অন্যের চেয়ে সুবিধাজনক। নীচে আপনি জাভাস্ক্রিপ্টে অ্যারে পুনরাবৃত্তি সম্পন্ন করার জন্য কিছু সাধারণভাবে ব্যবহৃত পদ্ধতি (সর্বাধিক সুবিধাজনক আইএমও) পেতে পারেন।

নতুন অ্যারে তৈরি করা হচ্ছে: Map

map()এটি এমন একটি ফাংশন Array.prototypeযা এরেলের প্রতিটি উপাদানকে রূপান্তর করতে পারে এবং তারপরে একটি নতুন অ্যারে প্রদান করে। map()একটি যুক্তি হিসাবে কলব্যাক ফাংশন নেয় এবং নিম্নলিখিত পদ্ধতিতে কাজ করে:

let arr = [1, 2, 3, 4, 5];

let newArr = arr.map((element, index, array) => {
  return element * 2;
})

console.log(arr);
console.log(newArr);

map()আর্গুমেন্ট হিসাবে আমরা যে কলব্যাকটি দিয়েছি তা প্রতিটি উপাদানগুলির জন্য কার্যকর হয়। তারপরে একটি অ্যারে ফিরে আসে যার মূল অ্যারের সমান দৈর্ঘ্য রয়েছে। এই নতুন অ্যারে উপাদানটি আর্গুমেন্ট হিসাবে পাস করা কলব্যাক ফাংশনটির মাধ্যমে রূপান্তরিত হয়map()

mapএবং লুপের মতো forEachএবং লুপের মধ্যে আলাদা পার্থক্যটি for..ofহ'ল mapনতুন অ্যারেটি ফিরে আসে এবং পুরানো অ্যারেটি অক্ষত রেখে দেয় (আপনি যদি স্পষ্টভাবে এটির মতো চিন্তা করে ম্যানিপুলেট করেন তবে splice)।

এছাড়াও, নোট করুন যে mapফাংশনের কলব্যাকটি দ্বিতীয় আর্গুমেন্ট হিসাবে বর্তমান পুনরাবৃত্তির সূচক সংখ্যা সরবরাহ করে। তদ্ব্যতীত, তৃতীয় যুক্তি অ্যারে সরবরাহ করে যার উপর mapডাকা হয়েছিল? কখনও কখনও এই বৈশিষ্ট্য খুব দরকারী হতে পারে।

লুপ ব্যবহার করে forEach

forEachএকটি ফাংশন যা Array.prototypeএটিতে অবস্থিত যা একটি যুক্তি হিসাবে কলব্যাক ফাংশন নেয় takes এটি অ্যারের প্রতিটি উপাদানগুলির জন্য এই কলব্যাক ফাংশনটি সম্পাদন করে। map()ফাংশনের বিপরীতে , forEach ফাংশনটি কিছুই দেয় না ( undefined)। উদাহরণ স্বরূপ:

let arr = [1, 2, 3, 4, 5];

arr.forEach((element, index, array) => {

  console.log(element * 2);

  if (index === 4) {
    console.log(array)
  }
  // index, and oldArray are provided as 2nd and 3th argument by the callback

})

console.log(arr);

ঠিক mapফাংশনের মতোই , forEachকলব্যাকটি দ্বিতীয় আর্গুমেন্ট হিসাবে বর্তমান পুনরাবৃত্তির সূচক সংখ্যা সরবরাহ করে। এছাড়াও, তৃতীয় যুক্তিটি অ্যারে সরবরাহ করে যার উপর forEachডাকা হয়েছিল?

উপাদান ব্যবহার করে লুপ for..of

for..ofলুপ একটি অ্যারের (অথবা অন্য কোন iterable বস্তুর) এর প্রতিটি উপাদান মাধ্যমে loops। এটি নিম্নলিখিত পদ্ধতিতে কাজ করে:

let arr = [1, 2, 3, 4, 5];

for(let element of arr) {
  console.log(element * 2);
}

উপরের উদাহরণে, elementএকটি অ্যারের উপাদান হিসাবে দাঁড়িয়েছে এবং arrঅ্যারে যা আমরা লুপ করতে চাই। নামটি নোট করুনelement নির্বিচারে, এবং এটি কার্যকর হলে আমরা 'এল' এর মতো অন্য কোনও নাম বা আরও কিছু ঘোষিত ঘোষণা করতে পারতাম।

for..inলুপটি লুপের সাথে বিভ্রান্ত করবেন না for..offor..inঅ্যারের সমস্ত গুণকীয় বৈশিষ্ট্য for..ofলুপ করবে যখন লুপটি কেবল অ্যারের উপাদানগুলির মধ্য দিয়ে লুপ করবে। উদাহরণ স্বরূপ:

let arr = [1, 2, 3, 4, 5];

arr.foo = 'foo';

for(let element of arr) {
  console.log(element);
}

for(let element in arr) {
  console.log(element);
}

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