জাভাস্ক্রিপ্টে একটি অ্যারের মাধ্যমে লুপ করুন


3141

জাভাতে আপনি forনিম্নরূপে একটি অ্যারে অবজেক্টগুলিকে আড়াআড়ি করতে একটি লুপ ব্যবহার করতে পারেন :

String[] myStringArray = {"Hello", "World"};
for (String s : myStringArray)
{
    // Do something
}

আপনি কি জাভাস্ক্রিপ্ট এ একই করতে পারেন?


5
ঠিক আছে, তাই আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি, যখন আপনি বস্তুগুলি অ্যাক্সেস করবেন তখন লুপের জন্য বর্ধিত ব্যবহার করা ঠিক হবে? এবং একটি পূরণের জন্য অনুক্রমিক ব্যবহার করবেন? এটা কি সঠিক?
সিজমানস্কি

45
না, এটি সত্যই সরল, অ্যারে অবজেক্টগুলির সংখ্যাসূচক সূচক রয়েছে, সুতরাং আপনি সেই সূচকগুলিকে সংখ্যার ক্রমে পুনরাবৃত্তি করতে চান , একটি ক্রমযুক্ত লুপ নিশ্চিত করে যে, বর্ধিত for-in লুপটি নির্দিষ্ট ক্রম ছাড়াই অবজেক্টের বৈশিষ্ট্যগুলি গণনা করে , এবং এটি উত্তরাধিকার সূত্রে প্রাপ্ত বৈশিষ্ট্যগুলিও গণনা করে। .. অ্যারে ক্রমিক লুপগুলির মাধ্যমে পুনরাবৃত্তি করার জন্য সর্বদা সুপারিশ করা হয় ...
সিএমএস

2
এর সাথে সম্পর্কিত - stackoverflow.com/questions/5349425/...
jondavidjohn

6
jsben.ch/#/Q9oD5 <= এখানে অ্যারেগুলির মাধ্যমে লুপিংয়ের জন্য একগুচ্ছ সমাধানের একটি মাপদণ্ড
এস্কেপনেটস্কেপ

3
@ সিএমএস না, এটি আসলে সহজ নয়। এটি অন্য প্রতিটি ভাষায় সত্যই সহজ। এটি হাস্যকরভাবে জেএসে জটিল, যেখানে আপনার রয়েছে inএবং ofএটি উভয়ই ব্যবহার করা যেতে পারে এবং বিভিন্ন জিনিস করা যায়। তারপরে আপনার এবং forEachকুরুচিপূর্ণ এবং বিরক্তিকর সূচক ভিত্তিক লুপিংও রয়েছে। অন্যান্য প্রতিটি আধুনিক ভাষা কোনও সংগ্রহ বা লুপিংকে কোনও আশ্চর্য বা বিভ্রান্তি ছাড়াই সহজ এবং সোজা করে তোলে। জেএসও পারে, তবে তা করে না।
jpmc26

উত্তর:


3953

আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে:

1. অনুক্রমিক forলুপ:

var myStringArray = ["Hello","World"];
var arrayLength = myStringArray.length;
for (var i = 0; i < arrayLength; i++) {
    console.log(myStringArray[i]);
    //Do something
}

পেশাদাররা

  • প্রতিটি পরিবেশে কাজ করে
  • আপনি নিয়ন্ত্রণ বিবৃতি ব্যবহার breakএবং continueপ্রবাহ করতে পারেন

কনস

2. অ্যারে.প্রোটোটাইপ.ফোর প্রতিটি

ES5 স্পেসিফিকেশন প্রচুর উপকারী অ্যারে পদ্ধতি প্রবর্তন করেছে, এর মধ্যে Array.prototype.forEachএকটি , এবং এটি আমাদেরকে অ্যারের মাধ্যমে পুনরাবৃত্তি করার একটি সংক্ষিপ্ত উপায় দেয়:

const array = ["one", "two", "three"]
array.forEach(function (item, index) {
  console.log(item, index);
});

ES5 স্পেসিফিকেশন প্রকাশের সময় হিসাবে প্রায় দশ বছর হওয়ায় (ডিসেম্বর ২০০৯), এটি ডেস্কটপ, সার্ভার এবং মোবাইল এনভায়রনমেন্টের প্রায় সমস্ত আধুনিক ইঞ্জিন দ্বারা প্রয়োগ করা হয়েছে, সুতরাং এটি ব্যবহার করা নিরাপদ।

এবং ES6 তীর ফাংশন সিনট্যাক্সের সাহায্যে এটি আরও বেশি সংযুক্ত:

array.forEach(item => console.log(item));

আপনি প্রাচীন প্ল্যাটফর্মগুলি (যেমন, আই 11) সমর্থন করার পরিকল্পনা না করে তীর ফাংশনগুলিও ব্যাপকভাবে প্রয়োগ করা হয়; আপনি যেতে নিরাপদ।

পেশাদাররা

  • খুব সংক্ষিপ্ত এবং সংক্ষিপ্ত
  • ঘোষণামূলক

কনস

  • ব্যবহার করতে পারবেন না break/continue

সাধারণত, আপনি breakঅ্যারে উপাদানগুলি পুনরাবৃত্তি করার আগে ফিল্টার করে প্রয়োজনীয় লুপগুলি আউট করার প্রয়োজন প্রতিস্থাপন করতে পারেন , উদাহরণস্বরূপ:

array.filter(item => item.condition < 10)
     .forEach(item => console.log(item))

মনে রাখবেন আপনি যদি এটি থেকে অন্য অ্যারে তৈরি করতে কোনও অ্যারেটি পুনরাবৃত্তি করছেন তবে আপনার ব্যবহার করা উচিত map, আমি এতবার এই অ্যান্টি-প্যাটার্ন দেখেছি।

এন্টি-প্যাটার্ন:

const numbers = [1,2,3,4,5], doubled = [];

numbers.forEach((n, i) => { doubled[i] = n * 2 });

মানচিত্রের যথাযথ ব্যবহারের ক্ষেত্রে :

const numbers = [1,2,3,4,5];
const doubled = numbers.map(n => n * 2);

console.log(doubled);

এছাড়াও, যদি আপনি অ্যারেটিকে কোনও মানকে হ্রাস করার চেষ্টা করছেন , উদাহরণস্বরূপ, আপনি সংখ্যার একটি অ্যারে যোগ করতে চান, আপনার হ্রাস পদ্ধতিটি ব্যবহার করা উচিত ।

এন্টি-প্যাটার্ন:

const numbers = [1,2,3,4,5];
const sum = 0;
numbers.forEach(num => { sum += num });

হ্রাস সঠিক ব্যবহার :

const numbers = [1,2,3,4,5];
const sum = numbers.reduce((total, n) => total + n, 0);

console.log(sum);

3. ES6 for-ofবিবৃতি

ES6 স্ট্যান্ডার্ডটি পুনরাবৃত্তিযোগ্য অবজেক্টগুলির ধারণার পরিচয় দেয় এবং ডেটা ট্র্যাভারিংয়ের জন্য একটি নতুন কনস্ট্রাক্টের সংজ্ঞা দেয় for...of

এই বিবৃতিটি যেকোন ধরণের পুনরাবৃত্তিযোগ্য অবজেক্টের জন্য এবং জেনারেটরের জন্যও (যে কোনও বস্তুর একটি [Symbol.iterator]সম্পত্তি রয়েছে) এর জন্য কাজ করে।

অ্যারে অবজেক্টগুলি ES6-এ অন্তর্নির্মিত পুনরাবৃত্তির সংজ্ঞা অনুসারে হয়, সুতরাং আপনি তাদের উপর এই বিবৃতিটি ব্যবহার করতে পারেন:

let colors = ['red', 'green', 'blue'];
for (const color of colors){
    console.log(color);
}

পেশাদাররা

  • এটি বিভিন্ন ধরণের অবজেক্টে পুনরাবৃত্তি করতে পারে।
  • স্বাভাবিক প্রবাহ নিয়ন্ত্রণ বিবৃতি ( break/ continue) ব্যবহার করতে পারেন ।
  • সিরিয়াল অ্যাসিনক্রোনাস মানগুলি পুনরাবৃত্তি করতে দরকারী।

কনস

ব্যবহার করবেন না for...in

@ জিপকোডেমান for...inবিবৃতিটি ব্যবহারের পরামর্শ দেয় তবে পুনরাবৃত্তির অ্যারেগুলি for-inএড়ানো উচিত, এই বিবৃতিটি অবজেক্টের বৈশিষ্ট্যগুলি গণনা করা to

এটি অ্যারের মতো বস্তুর জন্য ব্যবহার করা উচিত নয় কারণ:

  • পুনরাবৃত্তির ক্রমটি গ্যারান্টিযুক্ত নয়; অ্যারে সূচকগুলি সংখ্যার ক্রমে ভিজিট করা যাবে না।
  • উত্তরাধিকারী সম্পত্তিগুলিও গণনা করা হয়।

দ্বিতীয় বিষয়টি এটি আপনাকে প্রচুর সমস্যা দিতে পারে, উদাহরণস্বরূপ, আপনি যদি Array.prototypeকোনও পদ্ধতি অন্তর্ভুক্ত করার জন্য যদি বিষয়টিকে প্রসারিত করেন তবে সেই সম্পত্তিটিও গণনা করা হবে।

উদাহরণ স্বরূপ:

Array.prototype.foo = "foo!";
var array = ['a', 'b', 'c'];

for (var i in array) {
    console.log(array[i]);
}

উপরের কোডটি "এ", "বি", "সি", এবং "ফু!" লগ কনসোল করবে।

আপনি যদি এমন কিছু লাইব্রেরি ব্যবহার করেন যা দেশীয় প্রোটোটাইপস বৃদ্ধির উপর নির্ভর করে (যেমন উদাহরণস্বরূপ MooTools) তবে এটি বিশেষত একটি সমস্যা হতে পারে।

for-inআমি আগেই বলেছিলাম যে বিবৃতিটিতে অবজেক্টের বৈশিষ্ট্যগুলি গণনা করার আছে , উদাহরণস্বরূপ:

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

for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) { 
        // or if (Object.prototype.hasOwnProperty.call(obj,prop)) for safety...
        console.log("prop: " + prop + " value: " + obj[prop])
    }
}

উপরের উদাহরণে, hasOwnPropertyপদ্ধতিটি আপনাকে কেবল নিজস্ব বৈশিষ্ট্যগুলি গণনা করার অনুমতি দেয় , এটি হ'ল কেবলমাত্র সেই বৈশিষ্ট্য যা শারীরিকভাবে বস্তুর রয়েছে, উত্তরাধিকারসূত্রে প্রাপ্ত কোনও বৈশিষ্ট্য নয়।

আমি আপনাকে নিম্নলিখিত নিবন্ধটি পড়ার পরামর্শ দিচ্ছি:


20
এই কারণে (সিএমএস তাকে স্ব দ্বারা) হল stackoverflow.com/questions/1885317/...
OscarRyz

14
@ ডাবলগ্রাস, আমি মনে করি এটি এমন একটি মতামত যা সবাই ভাগ করে নেবে না। দেখুন: stackoverflow.com/questions/5752906/... বা groups.google.com/forum/?fromgroups#!topic/jsmentors/...
Matthijs ওয়েসেলস

2
যে কেউ ভাবছে যে আপনাকে দৈর্ঘ্যটি ক্যাশে করা দরকার ... দয়া করে আমার উত্তরটি দেখুন, আপনার একবারে এটি অ্যাক্সেস করার দরকার নেই, এটিকে ক্যাশে ছেড়ে দিন: (var i = 0, আইটেম = আইটেম = মাইস্ট্রিংআরাই [i]; আমি ++) {/ * আইটেমটি এখানে ব্যবহার করুন * /}
স্টিজন ডি উইট

13
@StijndeWitt না, কারণ যে বিরতি যদি আপনি কোন আছে যদি "falsey" আপনার অ্যারের মধ্যে মান: false, undefined, 0, "", NaN
ফ্রোগজ

5
jsperf.com/caching-array-length/4 জাভাস্ক্রিপ্ট লুপে অ্যারের দৈর্ঘ্যটি ক্যাচ করা মূল্যবান কিনা তা দেখার জন্য এখানে একটি পরীক্ষা দেওয়া হয়েছে
এনরিকো

1113

হ্যাঁ, আপনার বাস্তবায়নে ECMAScript 2015 ("সুরেলা" রিলিজ) প্রবর্তিত বৈশিষ্ট্য অন্তর্ভুক্ত রয়েছে for...of এটি আজকাল বেশ নিরাপদ অনুমান।

এটি এর মতো কাজ করে:

// REQUIRES ECMASCRIPT 2015+
var s, myStringArray = ["Hello", "World"];
for (s of myStringArray) {
  // ... do something with s ...
}

বা আরও ভাল, যেহেতু ECMAScript 2015 এছাড়াও ব্লক-স্কোপড ভেরিয়েবলগুলি সরবরাহ করে:

// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here

( sপ্রতিটি পুনরাবৃত্তির ক্ষেত্রে ভেরিয়েবলটি পৃথক, তবে constলুপের বডিটির ভিতরে এটি যতক্ষণ না সংশোধন করা হয় ততক্ষণ তা ঘোষণা করা যেতে পারে ))

বিচ্ছিন্ন অ্যারেগুলিতে একটি নোট: জাভাস্ক্রিপ্টে একটি অ্যারে আসলে তার আইটেম হিসাবে যতটা আইটেম সংরক্ষণ করেছে তা সংরক্ষণ করতে পারে না length; যে রিপোর্ট করা সংখ্যাটি সর্বাধিক সূচকের চেয়ে একটি বড়, যেখানে মান সঞ্চিত হয়। যদি অ্যারে এর দৈর্ঘ্য দ্বারা নির্দেশিত চেয়ে কম উপাদান ধারণ করে, তবে এটি বিরল বলে । উদাহরণস্বরূপ, কেবলমাত্র সূচি 3, 12 এবং 247 এ আইটেমগুলির সাথে অ্যারে রাখা পুরোপুরি বৈধ; lengthযেমন একটি অ্যারের, 248 হিসাবে রিপোর্ট যদিও এটি শুধুমাত্র আসলে 3 সংরক্ষণকারী মান হয়। আপনি যদি অন্য কোনও সূচকে কোনও আইটেম অ্যাক্সেস করার চেষ্টা করেন তবে অ্যারের undefinedমানটি সেখানে উপস্থিত হবে। সুতরাং আপনি যখন একটি অ্যারে "লুপ" করতে চান, আপনার উত্তর দেওয়ার একটি প্রশ্ন রয়েছে: আপনি কি তার দৈর্ঘ্য এবং প্রক্রিয়া দ্বারা নির্দেশিত সম্পূর্ণ পরিসরটি লুপ করতে চান?undefinedকোনও অনুপস্থিত উপাদানগুলির জন্য s, বা আপনি কেবল প্রকৃত উপস্থিত উপাদানগুলিই প্রক্রিয়া করতে চান? উভয় পদ্ধতির জন্য প্রচুর অ্যাপ্লিকেশন রয়েছে; এটি ঠিক নির্ভর করে আপনি কী জন্য অ্যারে ব্যবহার করছেন।

যদি আপনি এর সাথে একটি অ্যারে দিয়ে পুনরাবৃত্তি করেন for.. of, লুপের বডিটি কার্যকর হয় lengthবার, এবং লুপ নিয়ন্ত্রণ পরিবর্তনশীল undefinedঅ্যারেতে উপস্থিত না এমন কোনও আইটেমের জন্য সেট করা হয় । আপনার "কোড সহ কিছু করুন" কোডের বিশদের উপর নির্ভর করে সেই আচরণটি আপনি যা চান তা হতে পারে তবে তা না হলে আপনার আলাদা পদ্ধতির ব্যবহার করা উচিত।

অবশ্যই, কিছু ডেভেলপারদের কোন উপায় নেই কিন্তু কারণ যাই হোক না কেন কারণ তারা যে এখনও সমর্থন করে না জাভাস্ক্রিপ্ট একটি সংস্করণ লক্ষ্য করে সেটির যাহাই হউক না কেন একটি ভিন্ন পদ্ধতির ব্যবহার, for... of

যতক্ষণ আপনার জাভাস্ক্রিপ্ট প্রয়োগ ECMAScript স্পেসিফিকেশনের পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্যপূর্ণ (যার বিধান নেই, উদাহরণস্বরূপ, 9 এর পূর্বে ইন্টারনেট এক্সপ্লোরার সংস্করণ) তবে আপনি Array#forEachলুপের পরিবর্তে পুনরুক্তি পদ্ধতিটি ব্যবহার করতে পারেন । সেক্ষেত্রে আপনি অ্যারেতে প্রতিটি আইটেম ডেকে ফাংশনটি পাস করবেন:

var myStringArray = [ "Hello", "World" ];
myStringArray.forEach( function(s) { 
     // ... do something with s ...
} );

বিপরীতে for... of, .forEachকেবল অ্যারের মধ্যে উপস্থিত উপাদানগুলির জন্য ফাংশনটি কল করে। যদি তিনটি উপাদান এবং 248 দৈর্ঘ্যের সাথে আমাদের অনুমানের অ্যারে পাস হয়ে যায় তবে এটি কেবলমাত্র 248 বার নয়, কেবল তিনবার ফাংশনটি কল করবে। এটি অনুপস্থিত উপাদান এবং উপাদানগুলির মধ্যে পার্থক্য করে যা আসলে সেট করা থাকে undefined; পরেরটির জন্য, এটি তবুও ফাংশনটিকে কল করবে, undefinedতর্ক হিসাবে পাস করবে। আপনি যদি এভাবেই স্পার্স অ্যারে পরিচালনা করতে চান .forEachতবে আপনার দোভাষী যদি সমর্থন করেও for... যাওয়ার উপায় হতে পারে of

চূড়ান্ত বিকল্পটি, যা জাভাস্ক্রিপ্টের সমস্ত সংস্করণে কাজ করে, এটি একটি স্পষ্ট গণনা লুপ । আপনি দৈর্ঘ্যের তুলনায় কেবল 0 থেকে এক পর্যন্ত কম গণনা করুন এবং কাউন্টারটিকে সূচক হিসাবে ব্যবহার করুন। বেসিক লুপটি দেখতে দেখতে:

var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i<len; ++i) {
  s = myStringArray[i];
  // ... do something with s ...
}

এই পদ্ধতির একটি সুবিধা হ'ল আপনি কীভাবে স্পার্স অ্যারে পরিচালনা করবেন তা চয়ন করতে পারেন; উপরের কোড লুপ পূর্ণ লাশ চালানো হবে lengthসঙ্গে, বার sসেট undefinedঠিক কোন অনুপস্থিত উপাদানের জন্য, for.. of। আপনি যদি এর পরিবর্তে কেবল বিরল অ্যারের প্রকৃত উপস্থিত উপাদানগুলি পরিচালনা .forEachকরতে চান তবে, আপনি inসূচকে একটি সাধারণ পরীক্ষা যোগ করতে পারেন :

var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i<len; ++i) {
  if (i in myStringArray) {
    s = myStringArray[i];
    // ... do something with s ...
  }
}

স্থানীয় ভেরিয়েবলের জন্য দৈর্ঘ্যের মান নির্ধারণ করা ( myStringArray.lengthলুপের শর্তে সম্পূর্ণ অভিব্যক্তি অন্তর্ভুক্ত করার সাথে ) কার্য সম্পাদনে উল্লেখযোগ্য পার্থক্য আনতে পারে যেহেতু এটি প্রতিটি সময় কোনও সম্পত্তি অনুসন্ধান এড়িয়ে যায়; আমার মেশিনে রেন্ডো ব্যবহার করে, গতিবেগ 43%।

আপনি লুপ ইনিশিয়ালাইজেশন ক্লজে দৈর্ঘ্য ক্যাচিংয়ের কাজটি দেখতে পাবেন:

var i, len, myStringArray = [ "Hello", "World" ];
for (len = myStringArray.length, i=0; i<len; ++i) {

সুস্পষ্ট গণনা লুপের অর্থ হ'ল আপনার যদি এটি চান তবে প্রতিটি মানের সূচীতে অ্যাক্সেস থাকতে পারে। আপনার যে ফাংশনে পাস হবে তার সূচকটি অতিরিক্ত প্যারামিটার হিসাবেও পাশ করা হয়েছে forEach, যাতে আপনি এটি সেভাবেও অ্যাক্সেস করতে পারেন:

myStringArray.forEach( function(s, i) {
   // ... do something with s and i ...
});

for... ofআপনাকে প্রতিটি বস্তুর সাথে সম্পর্কিত সূচক দেয় না, তবে যতক্ষণ না আপনি যে বস্তুর উপরে পুনরাবৃত্তি করছেন এটি আসলে একটি Array( for.. ofঅন্যান্য পুনরাবৃত্ত প্রকারের জন্য কাজ করে যা এই পদ্ধতিতে নাও পারে), আপনি অ্যারে ব্যবহার করতে পারেন এটিকে [সূচক, আইটেম] জোড়াগুলির অ্যারেতে পরিবর্তন করার জন্য # এন্ট্রি পদ্ধতি এবং তারপরে পুনরাবৃত্তি:

for (const [i, s] of myStringArray.entries()) {
  // ... do something with s and i ...
}

for... inসিনট্যাক্স অন্যদের দ্বারা উল্লিখিত একটি বস্তু সম্পত্তিসমূহ উপর লুপিং জন্য নয়; যেহেতু জাভাস্ক্রিপ্টে একটি অ্যারে কেবল সংখ্যার সম্পত্তি নাম (এবং একটি স্বয়ংক্রিয়ভাবে আপডেট হওয়া lengthসম্পত্তি) যুক্ত একটি অবজেক্ট তাই আপনি তাত্ত্বিকভাবে এটির সাথে কোনও অ্যারে লুপ করতে পারেন। তবে সমস্যাটি হ'ল এটি নিজেকে সংখ্যার সম্পত্তি মানগুলিতে সীমাবদ্ধ করে না (মনে রাখবেন যে পদ্ধতিগুলিও কেবলমাত্র এমন বৈশিষ্ট্য যাগুলির মান একটি বন্ধ), বা সংখ্যার ক্রম অনুসারে এটি পুনরাবৃত্তি করার নিশ্চয়তাও দেওয়া হয় না। সুতরাং, অ্যারে মাধ্যমে লুপিংয়ের জন্য for... inবাক্য গঠনটি ব্যবহার করা উচিত নয়


21
মনে রাখবেন, কিছু দোভাষী (যেমন V8) স্বয়ংক্রিয়ভাবে অ্যারের দৈর্ঘ্য ক্যাশে করবে যদি কোড যথেষ্ট বার বলা হয় এবং এটি সনাক্ত করে যে দৈর্ঘ্য লুপ দ্বারা পরিবর্তন করা হয় না। দৈর্ঘ্যটি ক্যাশে করার সময় এখনও দুর্দান্ত, যখন আপনার কোডটি আসলে কোনও পার্থক্য করার জন্য পর্যাপ্ত সময় চাওয়া হয় তখন এটি গতি বাড়িয়ে দিতে পারে না।
ফ্রেগজ

2
@ চিহ্ন-রিড আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন আপনি i in myStringArrayনিজের উদাহরণটিতে ব্যবহার করেছেন? কীভাবে তা মিথ্যা হতে পারে?
ডেনিস ভি

2
@ ডেনিসভ: মিথ্যা। a=[1,2,3,4]; delete a[2]; for (j in a) { console.log(j); } ফলাফল 0, 1, 3, এবং 4 a.lengthএখনও 5।
মার্ক রিড

1
আমি পরামর্শ নই for j in a। আমি প্রমাণ করছি যে inচেকটি রিডানডান্ট নয়, যেমনটি আপনি দাবি করেছিলেন এটি সমস্ত সূচি প্রদর্শন করে এবং দেখিয়ে দিয়েছিল যে 0 এর মধ্যে একটি রয়েছে এবং length-1এটি সেখানে নেই। আমি সবেমাত্র মুদ্রণ করতে পারতাম 2 in a, যা সত্যই falseআপনি সত্য বলে সত্ত্বেও এটি অসম্ভব বলেছিলেন।
মার্ক রিড

2
@ গ্রিজেশচৌহান - সঠিক উদাহরণস্বরূপ, আই 8 সংস্করণ মাধ্যমে এটি সমর্থন করে না। এই প্রশ্নটি দেখুন ।
মার্ক রিড

442

আপনি এটি ব্যবহার করতে পারেন mapযা কার্যকরী প্রোগ্রামিং প্রযুক্তি যা পাইথন এবং হাস্কেলের মতো অন্যান্য ভাষায়ও উপলভ্য ।

[1,2,3,4].map( function(item) {
     alert(item);
})

সাধারণ বাক্য গঠনটি হ'ল:

array.map(func)

সাধারণভাবে func একটি প্যারামিটার লাগবে, যা অ্যারের আইটেম। তবে জাভাস্ক্রিপ্টের ক্ষেত্রে এটি দ্বিতীয় প্যারামিটার নিতে পারে যা আইটেমের সূচক এবং তৃতীয় প্যারামিটার যা অ্যারে নিজেই।

এর রিটার্ন মান array.mapহ'ল অন্য অ্যারে, সুতরাং আপনি এটি ব্যবহার করতে পারেন:

var x = [1,2,3,4].map( function(item) {return item * 10;});

এবং এখন এক্স হয় [10,20,30,40]

আপনাকে ফাংশনটি ইনলাইন লিখতে হবে না। এটি একটি পৃথক ফাংশন হতে পারে।

var item_processor = function(item) {
      // Do something complicated to an item
}

new_list = my_list.map(item_processor);

যা এর সমতুল্য হবে:

 for (item in my_list) {item_processor(item);}

আপনি না পেলে new_list


7
না, তবে এটি আরও শক্তিশালী হতে পারে। এটি দেখুন: joelonsoftware.com/items/2006/08/01.html
হাসেন

97
সেই নির্দিষ্ট উদাহরণটি সম্ভবত ব্যবহার করে আরও ভালভাবে প্রয়োগ করা হয়েছে Array.forEachmapএকটি নতুন অ্যারে উত্পাদন করার জন্য।
হার্টো

21
@ হাসান, Array.prototype.mapপদ্ধতিটি ECMAScript 5 ম সংস্করণ স্ট্যান্ডার্ডের অংশ, এখনও সব বাস্তবায়নের (যেমন IE এর অভাব) তে উপলব্ধ নেই, এছাড়াও অ্যারে সম্পর্কে পুনরাবৃত্তি করার জন্যও আমার মনে হয় যে Array.prototype.forEachপদ্ধতিটি আরও শব্দার্থগতভাবে সঠিক ... এছাড়াও দয়া করে ডন ' টি ইন-ইন স্টেটমেন্টটির পরামর্শ দিন, আরও তথ্যের জন্য আমার উত্তর দেখুন :)
সিএমএস

3
forEachএবং এর মধ্যে পার্থক্য mapহ'ল প্রাক্তন পুনরাবৃত্তির ফলাফলগুলি ফিরিয়ে দেয় না। map(কখনও কখনও ওরফে collect, তবে এর থেকে খুব আলাদা apply) অ্যারের প্রতিটি উপাদানকে একটি संबंधित ফলাফলে রূপান্তর করার জন্য স্পষ্টতই; এটি 1-থেকে -1 ম্যাপিং , সুতরাং নাম। এটি ক্রিয়াকলাপের পুরো পরিবারের অংশ যা এতে অন্তর্ভুক্ত reduce(যা পুরো অ্যারে থেকে একক ফলাফল উত্পন্ন করে) এবং filter(যা মূল অ্যারের একটি উপসেট উত্পাদন করে) এবং এই জাতীয়। যেখানে forEachকেবল প্রতিটি উপাদান দিয়ে কিছু করা যায়, শব্দার্থতাকে অনির্ধারিত।
মার্ক রিড

4
ডাউনভোট কারণ আপনি যদি আসলে কোনও ম্যাপিং না করেন তবে []। ম্যাপটি ব্যবহার বিভ্রান্তিকর। [] .এফ প্রতিটি অর্থবোধ তৈরি করে এবং একই তিনটি যুক্তি ফাংশনেও পাস করে।
জেংকেভ

120

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

for(var i=0, len=myArray.length; i < len; i++){}

এটি পাশাপাশি অপ্টিমাইজড (অ্যারে দৈর্ঘ্যের "ক্যাশে")। আপনি যদি আরও জানতে চান তবে বিষয়টিতে আমার পোস্টটি পড়ুন


2
myArray.forEach (ফাংশন (আপত্তি) {}); এখনও সেরা
জানুয়ার Sverre

একটি ক্ষুদ্র উন্নতি: আপনি ব্যবহার করতে পারে ++iপরিবর্তেi++
roberkules

14
++iএকটি পুরানো স্কুলের অপ্টিমাইজেশান যে আধুনিক কম্পাইলার একটি দীর্ঘ সময় আগে :) যেহেতু লুপ জন্য একটি আপনার জন্য করতে হয় stackoverflow.com/a/1547433/1033348
ngryman

6
আপনাকে এই লুপটি ব্যবহারে সতর্ক থাকতে হবে। আমি এটি ব্যবহার শুরু করেছিলাম এবং আমার একটি ভুলের কারণে বাগটি ট্র্যাক করা শক্ত হয়েছিল। আপনি যদি দুটি লুপ এর মতো নীড় করে থাকেন: jsfiddle.net/KQwmL/1 । দুটি লুপগুলিতে ভের লেনটির নাম আলাদা করতে আপনাকে সতর্ক থাকতে হবে, অন্যথায় দ্বিতীয় লুপটি প্রথম লেনটি ওভাররাইট করবে।
রুই মার্কস

1
রুই মার্কস - আপনি আপনার পরিবর্তনশীলটির পরিবর্তে i_stopবা এর i_endপরিবর্তে নাম রাখতে পারেন len। এটি ঠিক যেমন পাঠযোগ্য (আরও বেশি না হলে!), এবং আপনি স্বাভাবিকভাবেই এই ধরণের সমস্যা এড়াতে পারবেন (যেহেতু আপনার অন্যান্য লুপটি পাবেন, যেমন j_stop)।
চিপ হগ

118

জন্য (মাইস্ট্রিংআরাই এর গুলি) {

(সরাসরি আপনার প্রশ্নের উত্তর: এখন আপনি পারেন!)

বেশিরভাগ অন্যান্য উত্তর সঠিক, তবে তারা উল্লেখ করেন না (এই লেখা হিসাবে) ইসিএমএ স্ক্রিপ্ট  6  2015 পুনরাবৃত্তি, for..ofলুপটি করার জন্য একটি নতুন পদ্ধতি আনছে ।

এই নতুন সিনট্যাক্সটি জাভাস্ক্রিপ্টে একটি অ্যারে পুনরুক্ত করার সবচেয়ে মার্জিত উপায় (যতক্ষণ আপনার পুনরাবৃত্তির সূচকের প্রয়োজন হয় না)।

এটি বর্তমানে ফায়ারফক্স 13+, ক্রোম 37+ এর সাথে কাজ করে এবং এটি অন্যান্য ব্রাউজারগুলির সাথে স্থানীয়ভাবে কাজ করে না (নীচে ব্রাউজারের সামঞ্জস্য দেখুন)। ভাগ্যক্রমে আমাদের কাছে জেএস সংকলক রয়েছে (যেমন বাবেল ) যা আমাদের আজ পরবর্তী প্রজন্মের বৈশিষ্ট্যগুলি ব্যবহার করতে দেয়।

এটি নোডেও কাজ করে (আমি এটি 0.12.0 সংস্করণে পরীক্ষা করেছি)।

একটি অ্যারে আইট্রেট করা

// You could also use "let" instead of "var" for block scope.
for (var letter of ["a", "b", "c"]) { 
   console.log(letter); 
}

অবজেক্টগুলির একটি অ্যারে আইট্রেটিং

var band = [
  {firstName : 'John', lastName: 'Lennon'}, 
  {firstName : 'Paul', lastName: 'McCartney'}
];

for(var member of band){
  console.log(member.firstName + ' ' + member.lastName); 
}

একটি জেনারেটর ইটারেটিং:

(উদাহরণস্বরূপ https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / স্টেটমেন্টস / ... থেকে নেওয়া হয়েছে )

function* fibonacci() { // a generator function
  let [prev, curr] = [1, 1];
  while (true) {
    [prev, curr] = [curr, prev + curr];
    yield curr;
  }
}

for (let n of fibonacci()) {
  console.log(n);
  // truncate the sequence at 1000
  if (n >= 1000) {
    break;
  }
}

সামঞ্জস্যতা সারণী: http://kangax.github.io/es5-compat-table/es6/# for.. for loops

স্পেস: http://wiki.ecmascript.org/doku.php?id=harmony:iterators

}


আপনি যদি ES6 ব্যবহার করেন তবে আমি এর const sপরিবর্তে প্রস্তাব দেবvar s
joeytw رکن

বড় অ্যারেগুলিতে আমার পরীক্ষায়, var s of arrনোডজেজে সূচকের দ্বারা লুপের জন্য সহজ কাউন্টার ব্যবহার করার এবং উপাদানগুলি পুনরুদ্ধারের তুলনায় মৃত্যুর প্রায় দ্বিগুণ (1.9x) ব্যবহার করা হয়
theferrit32

প্রথম এবং শেষ লাইনে সেই অদ্ভুত জিনিস কেন?
পিটার মর্টেনসেন

91

অপেরা, সাফারি, ফায়ারফক্স এবং ক্রোম এখন অনেকগুলি সাধারণ লুপগুলি অনুকূল করে তোলার জন্য বর্ধিত অ্যারে পদ্ধতির একটি সেট ভাগ করে।

আপনার এই সমস্তগুলির প্রয়োজন নাও থাকতে পারে তবে সেগুলি খুব কার্যকর হতে পারে বা যদি প্রতিটি ব্রাউজার তাদের সমর্থন করে।

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

ফিল্টার এমন কিছু আইটেমির অ্যারে দেয় যা কিছু শর্ত বা পরীক্ষা সন্তুষ্ট করে।

প্রতিটি অ্যারে সদস্য পরীক্ষায় পাস হলে প্রতিটি রিটার্ন সত্য হয়।

কিছু পরীক্ষায় উত্তীর্ণ হলে সত্য ফেরত দেয়।

forEach প্রতিটি অ্যারে সদস্যের উপর একটি ফাংশন চালায় এবং কিছুই ফিরিয়ে দেয় না।

মানচিত্র forEach এর মতো, তবে এটি প্রতিটি উপাদানটির জন্য অপারেশনের ফলাফলের একটি অ্যারে প্রদান করে।

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

আপনার প্রয়োজন না হওয়া পর্যন্ত এটি উপেক্ষা করুন।

indexOf এবং সর্বশেষপরিচয়প্রাপ্ত প্রথম বা শেষ উপাদানটির উপযুক্ত অবস্থানটি খুঁজে পায় যা তার যুক্তির সাথে হুবহু মিলে যায়।

(function(){
    var p, ap= Array.prototype, p2={
        filter: function(fun, scope){
            var L= this.length, A= [], i= 0, val;
            if(typeof fun== 'function'){
                while(i< L){
                    if(i in this){
                        val= this[i];
                        if(fun.call(scope, val, i, this)){
                            A[A.length]= val;
                        }
                    }
                    ++i;
                }
            }
            return A;
        },
        every: function(fun, scope){
            var L= this.length, i= 0;
            if(typeof fun== 'function'){
                while(i<L){
                    if(i in this && !fun.call(scope, this[i], i, this))
                        return false;
                    ++i;
                }
                return true;
            }
            return null;
        },
        forEach: function(fun, scope){
            var L= this.length, i= 0;
            if(typeof fun== 'function'){
                while(i< L){
                    if(i in this){
                        fun.call(scope, this[i], i, this);
                    }
                    ++i;
                }
            }
            return this;
        },
        indexOf: function(what, i){
            i= i || 0;
            var L= this.length;
            while(i< L){
                if(this[i]=== what)
                    return i;
                ++i;
            }
            return -1;
        },
        lastIndexOf: function(what, i){
            var L= this.length;
            i= i || L-1;
            if(isNaN(i) || i>= L)
                i= L-1;
            else
                if(i< 0) i += L;
            while(i> -1){
                if(this[i]=== what)
                    return i;
                --i;
            }
            return -1;
        },
        map: function(fun, scope){
            var L= this.length, A= Array(this.length), i= 0, val;
            if(typeof fun== 'function'){
                while(i< L){
                    if(i in this){
                        A[i]= fun.call(scope, this[i], i, this);
                    }
                    ++i;
                }
                return A;
            }
        },
        some: function(fun, scope){
            var i= 0, L= this.length;
            if(typeof fun== 'function'){
                while(i<L){
                    if(i in this && fun.call(scope, this[i], i, this))
                        return true;
                    ++i;
                }
                return false;
            }
        }
    }
    for(p in p2){
        if(!ap[p])
            ap[p]= p2[p];
    }
    return true;
})();

1
সংযোজন: আইই সংস্করণ 9 এর জন্য প্রতিটি সমর্থন করে, প্রতিটি পদ্ধতি এমএসডিএন-এর জন্য দেখুন
rwitzel

74

ইন্ট্রো

কলেজে আমার সময় থেকেই, আমি জাভা, জাভাস্ক্রিপ্ট, প্যাসকেল, এএবিপি , পিএইচপি, প্রগতি 4 জিএল, সি / সি ++ এবং সম্ভবত অন্য কয়েকটি ভাষায় আমি এখনই ভাবতে পারি না বলে প্রোগ্রাম করেছি।

যদিও তাদের সকলের নিজস্ব ভাষাতাত্ত্বিক আইডিয়োসিঙ্ক্রিজি রয়েছে, এই ভাষার প্রত্যেকটিরই অনেকগুলি একই বেসিক ধারণাটি ভাগ করা আছে। এই ধরণের ধারণাগুলিতে প্রক্রিয়া / ফাংশন IF, FORস্টেটমেন্টস, WHILE-লুপস এবং -লুপগুলি অন্তর্ভুক্ত রয়েছে।


একটি traditional forতিহ্যবাহী-লুপ

একটি traditional forতিহ্যবাহী লুপের তিনটি উপাদান রয়েছে:

  1. সূচনা: লুক ব্লকটি প্রথমবার কার্যকর হওয়ার আগে সম্পাদন করা হয়েছিল
  2. শর্ত: লুপ ব্লক কার্যকর হওয়ার আগে প্রতিবার একটি শর্ত পরীক্ষা করে এবং মিথ্যা হলে লুপটি ছেড়ে দেয়
  3. চিন্তাভাবনা: লুপ ব্লক কার্যকর হওয়ার পরে প্রতিবার সঞ্চালিত হয়

এই তিনটি উপাদান একে অপরের থেকে ;প্রতীক দ্বারা পৃথক করা হয় । এই তিনটি উপাদানের প্রত্যেকটির জন্য সামগ্রীগুলি alচ্ছিক, যার অর্থ নিম্নলিখিতটি সর্বাধিক ন্যূনতম forলুপটি সম্ভব:

for (;;) {
    // Do stuff
}

অবশ্যই এটি চালানো বন্ধ করার জন্য আপনাকে সেই- লুপের মধ্যে একটি if(condition === true) { break; } বা if(condition === true) { return; }অন্য কোথাও অন্তর্ভুক্ত করতে হবে for

সাধারণত, যদিও সূচনাটি সূচক ঘোষণার জন্য ব্যবহৃত হয়, শর্তটি সেই সূচকে ন্যূনতম বা সর্বাধিক মানের সাথে তুলনা করতে ব্যবহৃত হয়, এবং উত্তরোত্তরটি সূচককে বাড়ানোর জন্য ব্যবহৃত হয়:

for (var i = 0, length = 10; i < length; i++) {
    console.log(i);
}

forএকটি অ্যারের মাধ্যমে লুপ করতে একটি traditional তিহ্যগত লুপ ব্যবহার করে

অ্যারের মাধ্যমে লুপ করার traditionalতিহ্যগত উপায়টি হ'ল:

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

অথবা, আপনি যদি পিছনের দিকে লুপ করতে পছন্দ করেন তবে আপনি এটি করুন:

for (var i = myArray.length - 1; i > -1; i--) {
    console.log(myArray[i]);
}

তবে বিভিন্ন সম্ভাবনা রয়েছে যেমন উদাহরণস্বরূপ:

for (var key = 0, value = myArray[key], length = myArray.length; key < length; value = myArray[++key]) {
    console.log(value);
}

... বা এই ...

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

... বা এটি:

var key = 0, value;
for (; value = myArray[key++];){
    console.log(value);
}

যেটি সবচেয়ে ভাল কাজ করে তা হ'ল মূলত উভয় ব্যক্তিগত স্বাদ এবং আপনি ব্যবহার করছেন এমন নির্দিষ্ট ব্যবহারের ক্ষেত্রে।

মনে রাখবেন যে এই সমস্ত পরিবর্তনের প্রতিটি খুব পুরানো সহ সমস্ত ব্রাউজার দ্বারা সমর্থিত!


একজন while লুপ

forলুপের একটি বিকল্প হ'ল whileলুপ। একটি অ্যারের মাধ্যমে লুপ করতে, আপনি এটি করতে পারেন:

var key = 0;
while(value = myArray[key++]){
    console.log(value);
}

Traditionalতিহ্যবাহী forলুপগুলির মতো ,while লুপগুলি এমনকি ব্রাউজারগুলির সবচেয়ে পুরানো দ্বারা সমর্থিত।

এছাড়াও, নোট করুন যে প্রতিটি সময় লুপটি একটি forলুপ হিসাবে আবার লিখতে পারে । উদাহরণস্বরূপ, উপরে whileলুপটি এই- লুপের মতো ঠিক একইভাবে আচরণ করে for:

for(var key = 0; value = myArray[key++];){
    console.log(value);
}

For...in এবং for...of

জাভাস্ক্রিপ্টে, আপনি এটিও করতে পারেন:

for (i in myArray) {
    console.log(myArray[i]);
}

এটি যত্ন সহ ব্যবহার করা উচিত, কারণ এটি forসমস্ত ক্ষেত্রে traditional তিহ্যবাহী লুপের মতো আচরণ করে না এবং এর সম্ভাব্য পার্শ্ব-প্রতিক্রিয়াগুলিও বিবেচনা করা দরকার। দেখুন কেন অ্যারে পুনরাবৃত্তি সহ "for ... in" ব্যবহার করা খারাপ ধারণা?বিস্তারিত জানার জন্য.

এর বিকল্প হিসাবে for...in, এখন এর জন্যও রয়েছে for...of। নিম্নলিখিত উদাহরণটি for...ofলুপ এবং লুপের মধ্যে পার্থক্য দেখায় for...in:

var myArray = [3, 5, 7];
myArray.foo = "hello";

for (var i in myArray) {
  console.log(i); // logs 0, 1, 2, "foo"
}

for (var i of myArray) {
  console.log(i); // logs 3, 5, 7
}

অতিরিক্তভাবে, আপনাকে বিবেচনা করতে হবে যে ইন্টারনেট এক্সপ্লোরারের কোনও সংস্করণ সমর্থন করে না for...of( এজ 12+ প্রযোজ্য) এবং এর for...inজন্য কমপক্ষে ইন্টারনেট এক্সপ্লোরার 10 প্রয়োজন।


Array.prototype.forEach()

for-লুপগুলির বিকল্প Array.prototype.forEach(), যা নিম্নলিখিত সিনট্যাক্স ব্যবহার করে:

myArray.forEach(function(value, key, myArray) {
    console.log(value);
});

Array.prototype.forEach() সমস্ত আধুনিক ব্রাউজারগুলি পাশাপাশি ইন্টারনেট এক্সপ্লোরার 9 এবং তারপরে সমর্থন করে।


লাইব্রেরি

অবশেষে, অনেক ইউটিলিটি লাইব্রেরির নিজস্ব foreachবৈচিত্র রয়েছে। আফাইক, সবচেয়ে জনপ্রিয় তিনটি হ'ল:

jQuery.each(), jQuery এ :

$.each(myArray, function(key, value) {
    console.log(value);
});

_.each(), অ্যান্ডস্কোর.জেএস-এ :

_.each(myArray, function(value, key, myArray) {
    console.log(value);
});

_.forEach(), লোদাশ.জেএস এ :

_.forEach(myArray, function(value, key) {
    console.log(value);
});

68

লুপটি ব্যবহার করুন ...

var i=0, item, items = ['one','two','three'];
while(item = items[i++]){
    console.log(item);
}

লগগুলি: 'এক', 'দুই', 'তিন'

এবং বিপরীত ক্রমের জন্য, আরও বেশি দক্ষ লুপ

var items = ['one','two','three'], i = items.length;
while(i--){
    console.log(items[i]);
}

লগগুলি: 'তিন', 'দুই', 'এক'

বা ক্লাসিকাল forলুপ

var items = ['one','two','three']
for(var i=0, l = items.length; i < l; i++){
    console.log(items[i]);
}

লগগুলি: 'এক', 'দুই', 'তিন'

তথ্যসূত্র: http://www.sitepPoint.com/google-closure-how-not-to-write-javascript/


21
অ্যারে উপাদানগুলির মধ্যে কোনওটি মিথ্যা বললে "যখন" সিনট্যাক্সের প্রথম উদাহরণটি কাজ করবে না।
ক্রিস কুপার

2
... এবং এটি লুপের সমতুল্য: (var i = 0, আইটেম = আইটেম = আইটেম [i]; i++) এর জন্য, যা সূচি এবং আইটেমের ভেরিয়েবলগুলি আগেই ঘোষণা করার প্রয়োজনীয়তা
হ্রাস


39

আপনি যদি দ্রুত লুপটি লেখার ক্ষুদ্র উপায় চান এবং আপনি বিপরীতে পুনরাবৃত্তি করতে পারেন:

for (var i=myArray.length;i--;){
  var item=myArray[i];
}

টাইপ করার জন্য কম অক্ষর থাকার সময় এর দৈর্ঘ্য (একইরকম for (var i=0, len=myArray.length; i<len; ++i)এবং বিপরীতে for (var i=0; i<myArray.length; ++i)) ক্যাশে করার সুবিধা রয়েছে ।

এমনকি এমন কিছু সময় রয়েছে যখন আপনার বিপরীতে পুনরাবৃত্তি হওয়া উচিত, যেমন কোনও লাইভ নোডলিস্টের মাধ্যমে পুনরাবৃত্তি করার সময় যেখানে আপনি পুনরাবৃত্তির সময় ডিওএম থেকে আইটেমগুলি সরিয়ে নেওয়ার পরিকল্পনা করেন।


16
এমন লোকের পক্ষে যা এতটা জ্ঞানসম্মত হয় না: আই-- এক্সপ্রেশনটি প্রথমে মূল্যায়ন করা হয় এবং লুপটি মিথ্যা না হলে চালিয়ে যেতে দেয় ... তারপরে কাউন্টারটি হ্রাস করা হয়। আমি শূন্য হওয়ার সাথে সাথে এটি লুপের বাইরে বের হয়ে যাবে কারণ শূন্যটি জাভাস্ক্রিপ্টে একটি মিথ্যা মান।
স্টিজন ডি উইট

5
falsish? তুমি মিথ্যা বলতে চাচ্ছ আসুন সমস্ত বিভ্রান্তি এড়াতে যথাযথ পরিভাষাটি আটকে দিন;)
ড্যানওয়েলম্যান

4
আমি গুরু হিসাবে বিবেচিত লোকেরা মিথ্যা শব্দটি ব্যবহার করে দেখেছি। এটি যদি তাদের পক্ষে যথেষ্ট ভাল হয় তবে তা আমার পক্ষে যথেষ্ট। এছাড়াও একটি তবে হতাশ যে আমার মন্তব্যটি আসলে অনটপিক এবং ব্যাখ্যা / অন্তর্দৃষ্টি যোগ করে 0 টি আপভোস্ট পেয়েছে, তবে আমার মন্তব্যে একটি শব্দে নিটপিক্স পেয়েছে এমন মন্তব্য 4 আহা আমার ধারণা অগ্রাধিকারের বিষয় মাত্র Ah
স্টিজন ডি উইট

"দৈর্ঘ্য ক্যাচিং"? অ্যারেতে দৈর্ঘ্যটি পূর্ণসংখ্যা হিসাবে সঞ্চিত হয়, আপনি যখনই এটি অ্যাক্সেস করবেন ততবার এটি মাপা হয় না। দৈর্ঘ্যের মানটিকে অন্য ভেরিয়েবলে অনুলিপি করার কোনও সুবিধা নেই।
Mouscellaneous

1
এই মুহূর্তে অবশ্যই নেই; বিগত বছরগুলিতে জাভাস্ক্রিপ্টের অ্যারেগুলি পুনরুক্তি করে জাভাস্ক্রিপ্টের পাশে দৈর্ঘ্যটি ক্যাচিং করা হয়েছিল (বাস্তবায়নে পৌঁছানোর পরিবর্তে) একটি পরিষ্কার পারফরম্যান্স ছিল (যখন মাইক্রোপ্টিমাইজিং)। উদাহরণস্বরূপ, for (var i=0,len=array.length;i<len;++i)লেখার জন্য একটি সাধারণ, বুদ্ধিমান লুপ ছিল।
ফ্রোগজ

36

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

1. শুধু একটি অ্যারের মাধ্যমে লুপ

const myArray = [{x:100}, {x:200}, {x:300}];

myArray.forEach((element, index, array) => {
    console.log(element.x); // 100, 200, 300
    console.log(index); // 0, 1, 2
    console.log(array); // same myArray object 3 times
});

দ্রষ্টব্য: অ্যারে.প্রোটোটাইপ.এফ (প্রতিটি)) কার্যকরভাবে বলার মতো উপায় নয়, কারণ ইনপুট প্যারামিটার হিসাবে যে ফাংশনটি লাগে এটি কোনও মান ফেরত দেওয়ার কথা নয়, যা এইভাবে খাঁটি ফাংশন হিসাবে বিবেচনা করা যায় না।

2. অ্যারেতে থাকা উপাদানগুলির মধ্যে কোনও একটি পরীক্ষায় পাস করেছে কিনা তা পরীক্ষা করুন

const people = [
    {name: 'John', age: 23}, 
    {name: 'Andrew', age: 3}, 
    {name: 'Peter', age: 8}, 
    {name: 'Hanna', age: 14}, 
    {name: 'Adam', age: 37}];

const anyAdult = people.some(person => person.age >= 18);
console.log(anyAdult); // true

3. একটি নতুন অ্যারে রূপান্তর

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray= myArray.map(element => element.x);
console.log(newArray); // [100, 200, 300]

দ্রষ্টব্য: মানচিত্র () পদ্ধতি কলিং অ্যারেতে প্রতিটি উপাদানগুলিতে সরবরাহ করা ফাংশন কল করার ফলাফল সহ একটি নতুন অ্যারে তৈরি করে।

৪. একটি নির্দিষ্ট সম্পত্তি যোগফল এবং তার গড় গণনা

const myArray = [{x:100}, {x:200}, {x:300}];

const sum = myArray.map(element => element.x).reduce((a, b) => a + b, 0);
console.log(sum); // 600 = 0 + 100 + 200 + 300

const average = sum / myArray.length;
console.log(average); // 200

৫. মূলের উপর ভিত্তি করে তবে এটিকে পরিবর্তন না করেই নতুন অ্যারে তৈরি করুন

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray= myArray.map(element => {
    return {
        ...element,
        x: element.x * 2
    };
});

console.log(myArray); // [100, 200, 300]
console.log(newArray); // [200, 400, 600]

Each. প্রতিটি বিভাগের সংখ্যা গণনা করুন

const people = [
    {name: 'John', group: 'A'}, 
    {name: 'Andrew', group: 'C'}, 
    {name: 'Peter', group: 'A'}, 
    {name: 'James', group: 'B'}, 
    {name: 'Hanna', group: 'A'}, 
    {name: 'Adam', group: 'B'}];

const groupInfo = people.reduce((groups, person) => {
    const {A = 0, B = 0, C = 0} = groups;
    if (person.group === 'A') {
        return {...groups, A: A + 1};
    } else if (person.group === 'B') {
        return {...groups, B: B + 1};
    } else {
        return {...groups, C: C + 1};
    }
}, {});

console.log(groupInfo); // {A: 3, C: 1, B: 2}

Particular. নির্দিষ্ট মানদণ্ডের ভিত্তিতে একটি অ্যারের একটি উপসেট পুনরুদ্ধার করুন

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray = myArray.filter(element => element.x > 250);
console.log(newArray); // [{x:300}] 

দ্রষ্টব্য: ফিল্টার () পদ্ধতিটি এমন সমস্ত উপাদান দিয়ে একটি নতুন অ্যারে তৈরি করে যা প্রদত্ত ফাংশন দ্বারা প্রয়োগ করা পরীক্ষায় পাস করে।

8. একটি অ্যারে বাছাই করুন

const people = [
  { name: "John", age: 21 },
  { name: "Peter", age: 31 },
  { name: "Andrew", age: 29 },
  { name: "Thomas", age: 25 }
];

let sortByAge = people.sort(function (p1, p2) {
  return p1.age - p2.age;
});

console.log(sortByAge);

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

9. একটি অ্যারেতে একটি উপাদান সন্ধান করুন

const people = [ {name: "john", age:23},
                {name: "john", age:43},
                {name: "jim", age:101},
                {name: "bob", age:67} ];

const john = people.find(person => person.name === 'john');
console.log(john);

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

অ্যারে.প্রোটোটাইপ.ফাইন্ড () পদ্ধতিটি অ্যারেতে প্রথম উপাদানটির মান প্রদান করে যা সরবরাহিত পরীক্ষামূলক ক্রিয়াকে সন্তুষ্ট করে।

তথ্যসূত্র


30

এটির করার একটি উপায় আছে যেখানে আপনার লুপে খুব কমই অন্তর্নিহিত সুযোগ রয়েছে এবং অতিরিক্ত ভেরিয়েবলগুলি সরিয়ে ফেলে।

var i = 0,
     item;

// note this is weak to sparse arrays or falsey values
for ( ; item = myStringArray[i++] ; ){ 
    item; // This is the string at the index.
}

অথবা আপনি যদি সত্যই আইডিটি পেতে চান এবং সত্যিই শাস্ত্রীয় forলুপটি পেতে চান :

var i = 0,
    len = myStringArray.length; // cache the length

for ( ; i < len ; i++ ){
    myStringArray[i]; // Don't use this if you plan on changing the length of the array
}

আধুনিক ব্রাউজার সব সমর্থন পুনরুক্তিকারীর পদ্ধতি forEach, map, reduce, filterএবং এর অন্যান্য পদ্ধতি একটি হোস্ট এরে প্রোটোটাইপ


3
নোট করুন যে কিছু সংখ্যক দোভাষী (উদাহরণস্বরূপ V8) কোডটি পর্যাপ্ত সময় বলা হলেও স্বয়ংক্রিয়ভাবে অ্যারের দৈর্ঘ্যটি ক্যাশে করবে এবং এটি সনাক্ত করে যে দৈর্ঘ্যটি লুপ দ্বারা সংশোধিত হয়নি।
ফ্রোগজ

@ ফ্রোগজ তথ্যের জন্য ধন্যবাদ এটি সত্য যে ভিএম তৈরি করতে পারে এমন অনেক অপ্টিমাইজেশন রয়েছে তবে পুরানো ব্রাউজারগুলিতে এটি না থাকায় এটি এতটা সস্তা যেহেতু এটির জন্য এটি অপ্টিমাইজ করা ভাল অনুশীলন হবে।
গ্যাব্রিয়েল

1
@ গ্যাব্রিয়েল: কেন? দয়া করে বাস্তব-বিশ্বের উদাহরণ দিন যা দৈর্ঘ্যকে ক্যাশে না করা আসলে একটি পারফরম্যান্স বাধা। আমি 'অকালীন অপটিমাইজেশন সমস্ত মন্দের মূল' পদ্ধতির অনুসরণ করি। আমি যখন এটির মুখোমুখি হলাম তখন এটির একটি লুপটি প্রকৃতপক্ষে কোনও সমস্যা হয়ে উঠবে ...
স্টিজন ডি উইট

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

1
@ গ্যাব্রিয়েল আমি বিশ্বাস করি জাভাস্ক্রিপ্ট ইতিমধ্যে অ্যারেগুলিতে মানচিত্রের ক্রিয়াকলাপ সমর্থন করে, এর জন্য অতিরিক্ত লিব চালু করার দরকার নেই।
Noz

28

জাভাস্ক্রিপ্টে অ্যারের মাধ্যমে লুপ করার বিভিন্ন উপায় রয়েছে।

জেনেরিক লুপ:

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

ES5 এর জন্য:

substr.forEach(function(item) {
    // Do something with `item`
});

jQuery.each:

jQuery.each(substr, function(index, item) {
    // Do something with `item` (or `this` is also `item` if you like)
});

একটি চেহারা আছে এই বিস্তারিত তথ্যের জন্য বা আপনার কাছে পরীক্ষা করতে পারবেন MDN জাভাস্ক্রিপ্ট মধ্যে একটি অ্যারের মাধ্যমে looping & ব্যবহার jQuery এর চেক জন্য প্রতিটি জন্য jQuery


27

আমি আন্ডারস্কোর.জেএস ব্যবহারের পুঙ্খানুপুঙ্খ পরামর্শ দেব লাইব্রেরিটি । এটি আপনাকে বিভিন্ন ক্রিয়াকলাপ সরবরাহ করে যা আপনি অ্যারে / সংগ্রহের মাধ্যমে পুনরাবৃত্তি করতে ব্যবহার করতে পারেন।

এই ক্ষেত্রে:

_.each([1, 2, 3], function(num){ alert(num); });
=> alerts each number in turn...

7
এই প্রশ্নের নতুন আবিষ্কারকদের জন্য, আমি ঠিক ইন্ডোরস্কোরের আধ্যাত্মিক উত্তরসূরি লো-ড্যাশকে নির্দেশ করতে চাই যা এটির বিভিন্ন দিক থেকে উন্নতি করে।
মার্ক রিড

3
ইসিএমএ -262 যদি মিথের সাথে যুক্ত করা হয় underscoreতবে কেন ব্যবহার করবেন। নেটিভ কোড সর্বদা ভাল। forEach
ওয়াল্টার চ্যাপিলিকুইন - ডাব্লুজেডভিং

27

অ্যারে লুপ:

for(var i = 0; i < things.length; i++){
    var thing = things[i];
    console.log(thing);
}

অবজেক্ট লুপ:

for(var prop in obj){
    var propValue = obj[prop];
    console.log(propValue);
}

27

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

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

এই সমাধানগুলি:

1) লুপ জন্য

একটি forলুপ জাভাস্ক্রিপ্টে অ্যারের মাধ্যমে লুপিং একটি সাধারণ উপায়, তবে বড় অ্যারেগুলির দ্রুততম সমাধান হিসাবে বিবেচনা করা হয় না:

for (var i=0, l=arr.length; i<l; i++) {
  console.log(arr[i]);
}

2) লুপ করার সময়

লুপটিকে দীর্ঘ অ্যারে দিয়ে লুপের দ্রুততম উপায় হিসাবে বিবেচনা করা হয় তবে জাভা স্ক্রিপ্ট কোডে এটি সাধারণত কম ব্যবহৃত হয়:

let i=0;

while (arr.length>i) {
    console.log(arr[i]);
    i++;
}

3) যখন কি
একটি do whileএকই জিনিস করছে whileনিচের কিছু বাক্য গঠন পার্থক্য সঙ্গে

let i=0;
do {
  console.log(arr[i]);
  i++;
}
while (arr.length>i);

এটি জাভাস্ক্রিপ্ট লুপগুলি করার প্রধান উপায়, তবে এটি করার আরও কয়েকটি উপায় রয়েছে।

এছাড়াও আমরা for inজাভাস্ক্রিপ্টে বস্তুর উপর লুপিংয়ের জন্য একটি লুপ ব্যবহার করি ।

এছাড়াও তাকান map(), filter(), reduce()জাভাস্ক্রিপ্ট মধ্যে একটি অ্যারের উপর, ইত্যাদি ফাংশন। তারা ব্যবহার whileএবং এর চেয়ে অনেক দ্রুত এবং ভাল কিছু করতে পারেfor

আপনি যদি জাভাস্ক্রিপ্টে অ্যারেগুলিতে অ্যাসিনক্রোনাস ফাংশন সম্পর্কে আরও জানতে চান তবে এটি একটি ভাল নিবন্ধ।

কার্যকরী প্রোগ্রামিং আজকাল বিকাশের বিশ্বে বেশ স্প্ল্যাশ করছে। এবং সঙ্গত কারণে: কার্যকরী কৌশলগুলি আপনাকে আরও ঘোষণামূলক কোড লিখতে সহায়তা করতে পারে যা এক নজরে, রিফ্যাক্টর এবং পরীক্ষায় বোঝা সহজ।

ফাংশনাল প্রোগ্রামিংয়ের অন্যতম ভিত্তি হল এর তালিকা এবং তালিকার ক্রিয়াকলাপগুলির বিশেষ ব্যবহার। এবং এই জিনিসগুলি হ'ল শব্দগুলির মতো হ'ল: জিনিসগুলির অ্যারে এবং আপনি যে জিনিসগুলি তাদের কাছে করেন। তবে কার্যকরী মানসিকতা তাদের প্রত্যাশার চেয়ে কিছুটা আলাদা আচরণ করে।

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

এর অর্থ হ'ল আপনাকে আর কখনও লুপের জন্য লিখতে হবে না।

আরও পড়ুন >> এখানে :


একটি অ্যারের মাধ্যমে পুনরুক্তি করার সময় লুপ এবং কিছুক্ষণ লুপের পূর্বে সত্যিই কোনও পারফরম্যান্সের পার্থক্য রয়েছে? আমি এই ছাপের মধ্যে ছিলাম যে পার্থক্যগুলি মূলত সিনট্যাক্টিকাল
শেয়া

24

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

https://jsperf.com/fastest-array-iterator

কর্মক্ষমতা ফলাফল

ফলাফল:

The for()তিহ্যবাহী পুনরাবৃত্তকারীটি এখন পর্যন্ত দ্রুততম পদ্ধতি, বিশেষত যখন অ্যারের দৈর্ঘ্যের সাথে ক্যাশে থাকে

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

for(let i=0, size=arr.length; i<size; i++){
    // Do something
}

Array.prototype.forEach()এবং Array.prototype.map()পদ্ধতি ধীরতম অনুমান, সম্ভবত একটি ফল হিসেবে হয় ফাংশন কল ওভারহেড


এর i = i +1পরিবর্তে আরও ভাল ব্যবহার করা যায়i++
ডার্কব্লেজার

2
উন্নত করা যেতে পারে: দয়া করে আই ++ এর পরিবর্তে ++ i ব্যবহার করুন, এটি একটি অস্থায়ী বিষয়টিকে এড়িয়ে যাবে। সুতরাং এটি মেমরির ব্যবহার এবং সিপিইউ সময়কে হ্রাস করে (কোনও বরাদ্দের প্রয়োজন নেই)!
পাওয়ারস্ট্যাট

@ পাওয়ারস্ট্যাট আপনি কি তার সম্পর্কে একটি লিঙ্ক বা রেফারেন্স সরবরাহ করতে পারেন? আমি এটি সম্পর্কে কখনও শুনিনি, আকর্ষণীয় শোনায় ...
colxi

1
@ কলসি এই জাতীয় আকর্ষণীয় জিনিসের জন্য আপনার হার্ব সটার এবং স্কট মায়ার্সের কাছ থেকে হার্ড সি ++ স্টাফগুলি পড়া উচিত। ++ i বনাম আই ++ জিনিসটি বইটি থেকে: ব্যতিক্রমী সি ++: 47 ইঞ্জিনিয়ারিং ধাঁধা, প্রোগ্রামিং সমস্যা এবং সমাধান - আমি আপনাকে গুটডব্লিউসিএ এ খুঁজে পেতে পারি তবে প্রতিটি প্রোগ্রামিং ভাষার জন্য প্রমাণিত হতে পারে।
পাওয়ারস্ট্যাট

21

আপনি যদি jQuery লাইব্রেরি ব্যবহার করছেন তবে http://api.jquery.com/jQuery.each/ ব্যবহার বিবেচনা করুন

ডকুমেন্টেশন থেকে:

jQuery.each( collection, callback(indexInArray, valueOfElement) )

রিটার্নস: অবজেক্ট

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

$.each()ফাংশন হিসাবে একই নয় $(selector).each(), যা একটি jQuery বস্তুর ওভার, পুনরুক্তি করতে ব্যবহার করা হয় একচেটিয়াভাবে। $.each() ফাংশন, কোনো সংগ্রহ পুনরুক্তি উপর ব্যবহার করা যেতে পারে তা একটি মানচিত্র (জাভাস্ক্রিপ্ট অবজেক্ট) অথবা একটি অ্যারে। একটি অ্যারের ক্ষেত্রে, কলব্যাকটি প্রতিটি সময় অ্যারে সূচক এবং একটি অনুরূপ অ্যারে মান পাস করে। (মানটি thisকীওয়ার্ডের মাধ্যমেও অ্যাক্সেস করা যেতে পারে , তবে জাভাস্ক্রিপ্ট সর্বদা thisমানটিকে Objectএকটি সরল স্ট্রিং বা সংখ্যা মানের হলেও মোড়ানো হবে )) পদ্ধতিটি তার প্রথম আর্গুমেন্টটি প্রত্যাবর্তিত বস্তুটি ফেরত দেয়।


9
সব কিছুর জন্য jQuery?
ব্যতিক্রম

6
ব্যতিক্রম সহ একমত। অতিরিক্ত নির্ভরতার প্রভাবকে হ্রাস করবেন না। ইতিমধ্যে ভারী jQuery যেভাবেই ব্যবহার করা হচ্ছে কোড ব্যতীত আমি এর বিরুদ্ধে পরামর্শ দেব।
স্টিজন ডি উইট

2
আপডেট: আজকাল, আপনি নেটিভ অ্যারেগুলির সাথে একই রকম প্রভাব পেতে আরে.এফ.এচ ব্যবহার করতে পারেন ।
স্টিজন ডি উইট

20

আমি এখনও এই প্রকরণটি দেখতে পাই নি যা ব্যক্তিগতভাবে আমি ব্যক্তিগতভাবে পছন্দ করি:

একটি অ্যারে দেওয়া:

var someArray = ["some", "example", "array"];

দৈর্ঘ্যের সম্পত্তি অ্যাক্সেস না করে আপনি এটিকে লুপ করতে পারেন:

for (var i=0, item; item=someArray[i]; i++) {
  // item is "some", then "example", then "array"
  // i is the index of item in the array
  alert("someArray[" + i + "]: " + item);
}

এই জেএসফিডাল এটি দেখান যে: http://jsfiddle.net/prvzk/

এটি কেবল বিরল নয় এমন অ্যারেগুলির জন্য কাজ করে । মানে অ্যারেতে প্রতিটি সূচকে আসলে একটি মান রয়েছে। তবে, আমি দেখতে পেয়েছি যে অনুশীলনে আমি খুব কমই জাভাস্ক্রিপ্টে স্পার্স অ্যারে ব্যবহার করি ... এ জাতীয় ক্ষেত্রে সাধারণত কোনও মানচিত্র / হ্যাশ টেবিল হিসাবে কোনও অবজেক্ট ব্যবহার করা অনেক সহজ। আপনার যদি একটি স্পারস অ্যারে থাকে এবং 0 থেকে লুপ করতে চান 2 দৈর্ঘ্য -1, আপনার (var i = 0; i <someArray.length; ++ i) নির্মাণের জন্য প্রয়োজন তবে আপনার এখনও একটি দরকারif লুপের ভিতরে বর্তমান সূচকের উপাদানটি আসলে সংজ্ঞায়িত হয়েছে কিনা তা পরীক্ষা করতে to

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

আমি এই লুপটি সম্পর্কে যা পছন্দ করি তা হ'ল:

  • এটি লেখার জন্য ছোট
  • দৈর্ঘ্যের সম্পত্তি অ্যাক্সেস করার প্রয়োজন নেই (একা ক্যাশে দিন)
  • অ্যাক্সেস করার আইটেমটি আপনি যে নামটি চয়ন করেন তার নীচে লুপের বডিতে স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত হয়।
  • তালিকা / স্ট্যাকের মতো অ্যারে ব্যবহার করতে অ্যারে.পুষ্প এবং অ্যারে.স্প্লাইসের সাথে খুব স্বাভাবিকভাবে একত্রিত হয়

এই কাজটি করার কারণটি হ'ল অ্যারে স্পেসিফিকেশন আদেশ দেয় যে আপনি যখন কোনও সূচী> = অ্যারের দৈর্ঘ্য থেকে কোনও আইটেম পড়বেন, তখন এটি অপরিবর্তিত থাকবে। আপনি যখন কোনও স্থানে লিখবেন তখন এটি দৈর্ঘ্যটি আপডেট করবে।

আমার জন্য, এই নির্মাণটি জাভা 5 সিনট্যাক্সকে আমার নিকটবর্তী করে সবচেয়ে ঘনিষ্ঠভাবে অনুকরণ করে:

for (String item : someArray) {
}

... লুপের ভিতরে বর্তমান সূচী সম্পর্কে জানার অতিরিক্ত সুবিধা সহ


13
লক্ষ করুন যে, এই পদ্ধতির সঙ্গে লুপ যত তাড়াতাড়ি বন্ধ হবে এটি একটি খুঁজে বের করে falsey মান যেমন একটি খালি স্ট্রিং হিসেবে, 0, false, NaN, nullবা undefined, এমনকি সামনে iপৌছানোর দৈর্ঘ্য, যেমন: jsfiddle.net/prvzk/1
, CMS

3
লুপের অবস্থা হতে পারে (item=someArray[i]) !== undefined
daniel1426

18

প্রোটোটাইপের বিষয়গুলি সহ না করে কেবল নিজস্ব অবজেক্টের বৈশিষ্ট্যগুলিতে পুনরাবৃত্তি করার একটি পদ্ধতি রয়েছে:

for (var i in array) if (array.hasOwnProperty(i)) {
    // Do something with array[i]
}

তবে এটি এখনও কাস্টম-সংজ্ঞায়িত বৈশিষ্ট্যগুলিতে পুনরাবৃত্তি করবে।

জাভাস্ক্রিপ্টে কোনও কাস্টম সম্পত্তি কোনও অ্যারে সহ যে কোনও বস্তুকে বরাদ্দ করা যেতে পারে।

কেউ যদি ছড়িয়ে ছিটিয়ে থাকা অ্যারে দিয়ে পুনরাবৃত্তি করতে চায় তবে for (var i = 0; i < array.length; i++) if (i in array)বা এর array.forEachসাথে es5shimব্যবহার করা উচিত।


এবং কিভাবে ব্যবহার সম্পর্কে for (var i in array) if (++i)?
ড্যানিয়েল সোকলোভস্কি

15

এটি জাভাস্ক্রিপ্টে করার বেশ কয়েকটি উপায় রয়েছে। প্রথম দুটি উদাহরণ জাভাস্ক্রিপ্ট নমুনা। তৃতীয়টি একটি জাভাস্ক্রিপ্ট লাইব্রেরি ব্যবহার করে, যা .each()ফাংশনটির jQuery তৈরি করে making

var myStringArray = ["hello", "World"];
for(var i in myStringArray) {
  alert(myStringArray[i]);
}

var myStringArray = ["hello", "World"];
for (var i=0; i < myStringArray.length; i++) {
  alert(myStringArray[i]);
}

var myStringArray = ["hello", "World"];
$.each(myStringArray, function(index, value){
  alert(value);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


for...inঅ্যারের মতো অবজেক্টগুলির জন্য এড়ানো উচিত
ব্র্যাক

15

সবচেয়ে মার্জিত এবং দ্রুত উপায়

var arr = [1, 2, 3, 1023, 1024];
for (var value; value = arr.pop();) {
    value + 1
}

http://jsperf.com/native-loop-performance/8


সম্পাদিত (কারণ আমি ভুল ছিলাম)


100000 আইটেমের অ্যারের মাধ্যমে লুপিংয়ের জন্য পদ্ধতির তুলনা করুন এবং প্রতিটি সময় নতুন মান দিয়ে একটি ন্যূনতম অপারেশন করুন।

প্রস্তুতি:

<script src="//code.jquery.com/jquery-2.1.0.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min.js"></script>
<script>
    Benchmark.prototype.setup = function() {
        // Fake function with minimal action on the value
        var tmp = 0;
        var process = function(value) {
            tmp = value; // Hold a reference to the variable (prevent engine optimisation?)
        };

        // Declare the test Array
        var arr = [];
        for (var i = 0; i < 100000; i++)
            arr[i] = i;
    };
</script>

পরীক্ষা:

<a href="http://jsperf.com/native-loop-performance/16" 
   title="http://jsperf.com/native-loop-performance/16"
><img src="http://i.imgur.com/YTrO68E.png" title="Hosted by imgur.com" /></a>

এই লুপটি অ্যারের আইটেমগুলির ক্রম অনুসরণ করে বলে মনে হচ্ছে না।
ডেনিজ ওজগার

আমার পরীক্ষা ভুল ছিল। এটি সঠিক, এখন সমস্ত LOOPS দেখাচ্ছে। jsperf.com/native-loop-performance/16
molokoloco

@ বার্গি ঠিক বলেছেন। এই লুপটি অ্যারে মুছে ফেলার সাথে সাথে এটি লুপ হয়। বেশিরভাগ ক্ষেত্রে আপনি যা চান তা নয়।
স্টিজন ডি উইট

4
মিথ্যা আইটেম উপর বিরতি।
njzk2

12

অপ্টিমাইজড অ্যাপ্রোচ হ'ল অ্যারের দৈর্ঘ্যটি ক্যাশে করা এবং একক ভেরি প্যাটার্ন ব্যবহার করে একক ভেরওয়ার্ডের সাহায্যে সমস্ত ভেরিয়েবলকে আরম্ভ করা।

var i, max, myStringArray = ["Hello","World"];
for (i = 0, max = myStringArray.length; i < max; i++) {
    alert(myStringArray[i]);
   //Do something
}

যদি পুনরাবৃত্তির ক্রমটি আপনার বিপরীত লুপের চেষ্টা করার চেয়ে গুরুত্বপূর্ণ না হয় তবে এটি দ্রুততম কারণ এটি ওভারহেড কন্ডিশনের পরীক্ষাকে হ্রাস করে এবং হ্রাস একটি বিবৃতিতে হয়:

var i,myStringArray = ["item1","item2"];
for (i =  myStringArray.length; i--) {
    alert(myStringArray[i]);
}

বা লুপ করার সময় ব্যবহার করতে আরও ভাল এবং ক্লিনার:

var myStringArray = ["item1","item2"],i = myStringArray.length;
while(i--) {
   // do something with fruits[i]
}

12

জাভাস্ক্রিপ্টে, অ্যারে লুপ করার জন্য অনেকগুলি সমাধান রয়েছে।

নীচের কোডটি জনপ্রিয়

/** Declare inputs */
const items = ['Hello', 'World']

/** Solution 1. Simple for */
console.log('solution 1. simple for')

for (let i = 0; i < items.length; i++) {
  console.log(items[i])
}

console.log()
console.log()

/** Solution 2. Simple while */
console.log('solution 2. simple while')

let i = 0
while (i < items.length) {
  console.log(items[i++])
}

console.log()
console.log()

/** Solution 3. forEach*/
console.log('solution 3. forEach')

items.forEach(item => {
  console.log(item)
})

console.log()
console.log()

/** Solution 4. for-of*/
console.log('solution 4. for-of')

for (const item of items) {
  console.log(item)
}

console.log()
console.log()


12

আপনি যদি jQuery ব্যবহার করতে চান তবে এর ডকুমেন্টেশনে এটি একটি দুর্দান্ত উদাহরণ রয়েছে:

 $.each([ 52, 97 ], function( index, value ) {
      alert( index + ": " + value );
 });

12

আমার মতে সর্বোত্তম উপায় হ'ল অ্যারে.ফোর্চ ফাংশনটি ব্যবহার করা। আপনি যদি এটি ব্যবহার না করতে পারেন তবে আমি MDN থেকে পলিফিল নেওয়ার পরামর্শ দেব। এটি উপলভ্য করার জন্য, এটি অবশ্যই জাভাস্ক্রিপ্টে একটি অ্যারের মাধ্যমে পুনরাবৃত্তি করার সবচেয়ে নিরাপদ উপায়।

Array.prototype.forEach ()

সুতরাং অন্যরা যেমন পরামর্শ দিয়েছে, এটি প্রায়শই আপনি চান:

var numbers = [1,11,22,33,44,55,66,77,88,99,111];
var sum = 0;
numbers.forEach(function(n){
  sum += n;
});

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

নিয়মিত সি-স্টাইল ব্যবহার করা for লুপ বেশিরভাগ ক্ষেত্রে কাজ করে। এটি কেবল স্মরণে রাখা গুরুত্বপূর্ণ যে লুপের মধ্যে থাকা সমস্ত কিছু আপনার কর্মসূচির বাকি অংশটি ভাগ করে, {a একটি নতুন সুযোগ তৈরি করে না।

অত: পর:

var sum = 0;
var numbers = [1,11,22,33,44,55,66,77,88,99,111];

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

alert(i);

"11" আউটপুট দেবে - যা আপনি চান তা হতে পারে বা নাও পারে।

একটি কার্যকারী জেএসফিডাল উদাহরণ: https://jsfiddle.net/workingClassHacker/pxpv2dh5/7/


10

এটি 100% অভিন্ন নয়, তবে একই:

   var myStringArray = ['Hello', 'World']; // array uses [] not {}
    for (var i in myStringArray) {
        console.log(i + ' -> ' + myStringArray[i]); // i is the index/key, not the item
    }


1
দেখে মনে হচ্ছে এটি অ্যারে অবজেক্টের সাথে ব্যবহারের ক্ষেত্রে অন্যান্য সমস্যার মতোই ঘটবে, সেই প্রোটোটাইপ সদস্য ভেরিয়েবলগুলিও এর জন্য ধরা পড়বে।
Kzqai

9

উদাহরণস্বরূপ, আমি একটি ফায়ারফক্স কনসোল ব্যবহার করেছি:

[].forEach.call(document.getElementsByTagName('pre'), function(e){ 
   console.log(e);
})

9
var x = [4, 5, 6];
for (i = 0, j = x[i]; i < x.length; j = x[++i]) {
    console.log(i,j);
}

অনেক ক্লিনার ...


এটি তুলনায় খুব পরিষ্কার নয় z.forEach(j => console.log(j));
নীলা_ব্রীক

9

সংক্ষিপ্ত উত্তর: হ্যাঁ আপনি এটি দিয়ে করতে পারেন:

var myArray = ["element1", "element2", "element3", "element4"];

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

ব্রাউজার কনসোলে আপনি "এলিমেন্ট 1", "এলিমেন্ট 2" ইত্যাদি মুদ্রিত কিছু দেখতে পাবেন printed


9

আপনি হয় ব্যবহার করতে পারেন Array.prototype.forEach(...):

var arr = ["apple", "banana", "cherry", "mango"];
arr.forEach((item, index)=>{
   //Some code...
});

বা Array.prototype.map(...):

var arr = ["apple", "banana", "cherry", "mango"];
arr.map((item, index)=>{
   //Some code...
});

বা jquery বা পূর্বে উল্লিখিত লুপ জন্য।

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