জাভাস্ক্রিপ্টে সিনট্যাক্সের… এর জন্য ব্যবহার করে লুপ কাউন্টার / সূচক পান


316

সতর্ক করা:

প্রশ্ন এখনও প্রযোজ্য for…ofলুপ।> দো ব্যবহার করবেন for…inএকটি পুনরুক্তি উপর এরে এটি ব্যবহার পুনরুক্তি উপর বৈশিষ্ট্য একটি বস্তুর। বলেছিল, এই


আমি বুঝতে পারি যে for…inজাভাস্ক্রিপ্টের বেসিক সিনট্যাক্সটি এরকম দেখাচ্ছে:

for (var obj in myArray) {
    // ...
}

তবে আমি কীভাবে লুপের কাউন্টার / সূচক পেতে পারি ?

আমি জানি আমি সম্ভবত এরকম কিছু করতে পারি:

var i = 0;
for (var obj in myArray) {
    alert(i)
    i++
}

বা এমনকি ভাল পুরানো:

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

তবে আমি বরং সরল for-inলুপটি ব্যবহার করব । আমি মনে করি তারা আরও ভাল দেখায় এবং আরও বোধগম্য হয়।

একটি সহজ বা আরও মার্জিত উপায় আছে?


পাইথনে এটি সহজ:

for i, obj in enumerate(myArray):
    print i

6
অ্যারে জন্য ... জন্য ব্যবহার করবেন না। এবং যাইহোক, এটি সম্পত্তির নামগুলিতে পুনরাবৃত্তি করে, বৈশিষ্ট্যের মানগুলি না দিয়ে।
ফেলিক্স ক্লিং

1
এটি একটি অ্যারে, একটি অবজেক্ট না, তাই না? তো alert(obj),?
রকেট হাজমত

উত্তর:


544

for…inসম্পত্তির নামগুলি নিয়ে মানগুলি নয়, পুনরাবৃত্তি করে এবং তা অনির্ধারিত ক্রমে (হ্যাঁ, এমনকি ES6 এর পরেও) করে। অ্যারেতে পুনরাবৃত্তি করতে আপনার এটি ব্যবহার করা উচিত নয়। তাদের জন্য, ES5 এর forEachপদ্ধতি রয়েছে যা আপনি যে ফাংশনটি দেন তার মান এবং সূচি উভয়কেই পাস করে:

var myArray = [123, 15, 187, 32];

myArray.forEach(function (value, i) {
    console.log('%d: %s', i, value);
});

// Outputs:
// 0: 123
// 1: 15
// 2: 187
// 3: 32

বা ES6 এর Array.prototype.entriesএখনকার বর্তমান ব্রাউজার সংস্করণ জুড়ে সমর্থন রয়েছে:

for (const [i, value] of myArray.entries()) {
    console.log('%d: %s', i, value);
}

সাধারণভাবে পুনরাবৃত্তিযোগ্যদের জন্য (যেখানে আপনি ক এর for…ofপরিবর্তে লুপ ব্যবহার করবেন for…in) তবে অন্তর্নির্মিত কিছুই নেই, তবে:

function* enumerate(iterable) {
    let i = 0;

    for (const x of iterable) {
        yield [i, x];
        i++;
    }
}

for (const [i, obj] of enumerate(myArray)) {
    console.log(i, obj);
}

ডেমো

যদি আপনার প্রকৃত অর্থ হয় for…in- গণনা বৈশিষ্ট্য - আপনার একটি অতিরিক্ত কাউন্টারের প্রয়োজন হবে। Object.keys(obj).forEachকাজ করতে পারে, তবে এতে কেবল নিজস্ব সম্পত্তি রয়েছে ; for…inপ্রোটোটাইপ চেইনে যে কোনও জায়গায় অগণিত বৈশিষ্ট্য অন্তর্ভুক্ত।


2
ওহ ঠিক আছে. আমি বিভ্রান্ত ছিলাম. আমি ভেবেছিলাম জাভাস্ক্রিপ্টের ইন-ইন পাইথনের মতো same স্পষ্টতার জন্য ধন্যবাদ।
hobes3

1
@ কোয়ান্টাম্পোটাটো: letগুলি varব্লক স্কোপ সহ। constগুলি অপরিবর্তনীয়।
রাই-

1
এটি একটি বিস্তারিত উত্তর ছিল, এটির জন্য ধন্যবাদ। সত্যই আলোচিত সমস্ত বিষয় পরিষ্কার করে দিয়েছেন
ধীররাজ ভাস্কর

1
বোকা প্রশ্ন কিন্তু% d এবং% s আসলে কিসের পক্ষে দাঁড়ায়, বা তারা কি কোনও চিঠি হতে পারে আমি সেগুলি চাই?
ক্লিভিস

2
@ ক্লেউইস: %dএকটি পূর্ণসংখ্যা %sবিন্যাস করে এবং একটি স্ট্রিং ফর্ম্যাট করে। তারা প্রিন্টফের উপর ভিত্তি করে । কনসোল.স্পেক.ওয়াত.ইউইউইজিআরজি / টু ফর্ম্যাটটারে একটি অনুমান চলছে ।
রাই-

162

ES6 এ, লুপের জন্য ব্যবহার করা ভাল। আপনি এই মত জন্য সূচক পেতে পারেন

for (let [index, val] of array.entries()) {
        // your code goes here    
}

নোট করুন যে একটি পুনরাবৃত্তিরArray.entries() ফেরত দেয়, এটিই এটি লুপের জন্য কাজ করতে দেয়; এটি অবজেক্ট.এন্ট্রি () দিয়ে বিভ্রান্ত করবেন না , যা কী-মান জোড়ার একটি অ্যারে দেয়


9
এটি গৃহীত উত্তরটির চেয়ে অনেক ভাল উত্তর!
trusktr

3
আমি মনে করি এই দ্রবণটি প্রতি একের চেয়ে ভাল ... এটি লুপ সিনট্যাক্সের ... এর জন্য নামমাত্র ব্যবহার করে এবং আপনাকে আলাদা ফাংশন ব্যবহার করতে হবে না। অন্য কথায়, এটি সিন্টেক্সিকভাবে আরও ভাল। ওপি মনে হয় এটি চেয়েছিল।
u8y7541

1
entries()একটি খালি বস্তুর ফিরে হল: {}। কোন ধারণা কেন যে হবে? আমার arrayঅবজেক্টের অ্যারে।
জোশুয়া পিন্টার

@ জোশুয়াপিন্টার এর Object.entries(array)পরিবর্তে চেষ্টা করুনarray.entries()
টনিগ

2
এটি করার কথা, জোশুয়া - অবজেক্টটি একটি পুনরুক্তিকারী, এমন একটি পদার্থ যা একটি উপাদান যা next()প্রতিবার অ্যারেতে পরবর্তী প্রবেশপত্রগুলি ফিরিয়ে দেবে। এতে কোনও (দৃশ্যমান) ডেটা নেই; আপনি কল করে অন্তর্নিহিত বস্তুতে ডেটা পাবেন next(), যা পর্দার পিছনে কিছু করে। সিসি @tonyg
শোগ 9

26

এই সম্পর্কে কি

let numbers = [1,2,3,4,5]
numbers.forEach((number, index) => console.log(`${index}:${number}`))

যেখানে array.forEachএই পদ্ধতির একটি indexপ্যারামিটার রয়েছে যা অ্যারেতে প্রক্রিয়াজাত হওয়া বর্তমান উপাদানটির সূচক।


1
এখানে সেরা উত্তর
০৫ এ কোডেপ্লেব

4
নির্বাচিত উত্তরটি এর উত্তরটির 6 বছর আগে পোস্ট করা হয়েছিল এবং এতে ইতিমধ্যে একই জিনিস রয়েছে ...
দেইভ

Foreach অপ্টিমাইজেশনের জন্য ভাল না, যেহেতু breakউপলব্ধ নেই।
স্মার্টওয়ার্ল্ড-ডিএম

19

ছোট অ্যারে সংগ্রহের সমাধান:

for (var obj in arr) {
    var i = Object.keys(arr).indexOf(obj);
}

এআর - এআরএই, আপত্তি - বর্তমান উপাদানটির মূল প্রতিভা , আই - COUNTER / INDEX

বিজ্ঞপ্তি: আইই সংস্করণ <9 এর জন্য পদ্ধতি কী () উপলব্ধ নয়, আপনার পলিফিল কোড ব্যবহার করা উচিত । https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


7
আমি পরামর্শ দেব: পরিবর্তে একটি কাউন্টার ব্যবহার করুন, এটি লুপে বৃদ্ধি করুন।
mayankcpdixit

2
Mayankcpdixit এ যুক্ত করার পরিবর্তে, একটি কাউন্টার ব্যবহার করুন কারণ সূচিপত্রের নেতিবাচক কর্মক্ষমতা প্রভাব থাকতে পারে।
ডিন লিউ

1
বস্তু যত বড় হবে তত ধীরে ধীরে এটি পাবেন। এটি স্কেল হয় না।
dchacke

2
এই pointlessly ধীর ধরনের এবং কারণ জটিল var i = 0;এবং i++;খাটো এবং আরো দক্ষ হয়। এছাড়াও এটি এমন গুণাগুণগুলির পক্ষে কাজ করে না যা নিজস্ব বৈশিষ্ট্য নয়।
রাই-

1
@ ট্রাসক্রিটার: এবং যদি এটির প্রয়োজন হয় ... আপনার এখনও এটি ব্যবহার করা উচিত নয়। আপনি যখন সংগ্রহটি পরিবর্তন করেন তখন কাউন্টারটি পরিবর্তন করুন। যদি এটি জায়গায় না থেকে থাকে তবে পরিবর্তে একটি দুর্দান্ত কার্যকরী রূপান্তর করুন।
রাই-

13

ইন-লুপগুলি কোনও অবজেক্টের বৈশিষ্ট্যগুলিতে পুনরাবৃত্তি করে। এরাগুলির জন্য এগুলি ব্যবহার করবেন না, এমনকি যদি তারা কখনও কখনও কাজ করে।

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

একটি অ্যারের উপর লুপ:

var a = [];
for (var i=0; i<a.length; i++) {
    i // is the index
    a[i] // is the item
}

একটি বস্তুর উপর লুপ:

var o = {};
for (var prop in o) {
    prop // is the property name
    o[prop] // is the property value - the item
}

3
(var i=0; i<a.length; i++)সম্পদের অপচয় হিসাবে কখনই করবেন না । ব্যবহার(var i=0, var len = a.length; i<len; i++)
ফলিক্স সানজ

16
@ ফেলিক্সসানজ: বর্জ্য সংস্থানসমূহ? কোনভাবেই না. এটি একটি অকালীন মাইক্রো-অপ্টিমাইজেশন যা খুব কমই প্রয়োজন হয় এবং var i=0; i<a.length; i++)এটি আদর্শ লুপ প্যাটার্ন যা যাইহোক প্রতিটি শালীন জাভাস্ক্রিপ্ট ইঞ্জিন দ্বারা অনুকূলিত করা হয়।
বার্গি

3
@ ফেলিক্সসানজ: হ্যাঁ, এবং var i=0; i<a.length; i++এটি সর্বোত্তম অনুশীলন।
বার্গি

1
KISS । আপনি যদি লুপগুলি লিখেন যেখানে আপনার সত্যিই এটির প্রয়োজন হয় আপনি হয় কিছু ভুল করছেন বা আপনার প্রয়োজনের জন্য "সেরা অনুশীলন" এর চেয়ে ভাল যুক্তি রয়েছে। হ্যাঁ, এটি একটি স্ট্যান্ডার্ড অনুশীলন, তবে জেনেরিক পারফরম্যান্স অপ্টিমাইজেশনের জন্য নয়, কেবল মাইক্রো-অপ্টিমাইজেশনের জন্য।
বার্গি

3
KISS সর্বত্র প্রযোজ্য। অকাল অপটিমাইজেশন একটি বিরোধী অনুশীলন।
বার্গি

7

অন্যরা যেমন বলেছে, আপনাকে কোনও অ্যারের মাধ্যমে পুনরাবৃত্তি করতে..... ব্যবহার করা উচিত নয়।

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

আপনি যদি ক্লিনার সিনট্যাক্স চান তবে আপনি প্রতিটি জন্য ব্যবহার করতে পারেন:

myArray.forEach( function ( val, i ) { ... } );

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


2

উত্তর রাশআপ দ্বারা দেওয়া সঠিক তবে এটি আরও সুবিধাজনক হবে

for (let [index, val] of array.entries() || []) {
   // your code goes here    
}

1

এখানে এমন একটি ফাংশন eachWithIndexযা পুনরাবৃত্তিযোগ্য কোনও কিছুর সাথে কাজ করে।

আপনি অনুরূপ ফাংশনও লিখতে পারেন যা ব্যবহার eachWithKeyকরে প্রবক্তাদের সাথে কাজ করে for...in

// example generator (returns an iterator that can only be iterated once)
function* eachFromTo(start, end) { for (let i = start; i <= end; i++) yield i }

// convers an iterable to an array (potential infinite loop)
function eachToArray(iterable) {
    const result = []
    for (const val of iterable) result.push(val)
    return result
}

// yields every value and index of an iterable (array, generator, ...)
function* eachWithIndex(iterable) {
    const shared = new Array(2)
    shared[1] = 0
    for (shared[0] of iterable) {
        yield shared
        shared[1]++
    }
}

console.log('iterate values and indexes from a generator')
for (const [val, i] of eachWithIndex(eachFromTo(10, 13))) console.log(val, i)

console.log('create an array')
const anArray = eachToArray(eachFromTo(10, 13))
console.log(anArray)

console.log('iterate values and indexes from an array')
for (const [val, i] of eachWithIndex(anArray)) console.log(val, i)

জেনারেটরগুলির সাথে ভাল জিনিস হ'ল তারা অলস এবং যুক্তি হিসাবে অন্য জেনারেটরের ফলাফল নিতে পারে।


1

এটি আমার সম্মিলিত পুনরুদ্ধারের সংস্করণ যা একটি সূচক এবং কোনও পাস করা জেনারেটরের ফাংশনের মান (ধীর) মূল অনুসন্ধানের উদাহরণ দিয়ে দেয়:

const eachWithIndex = (iterable) => {
  return {
    *[Symbol.iterator]() {
      let i = 0
      for(let val of iteratable) {
        i++
          yield [i, val]
      }
    }
  }

}

const isPrime = (n) => {
  for (i = 2; i < Math.floor(Math.sqrt(n) + 1); i++) {
    if (n % i == 0) {
      return false
    }
  }
  return true
}

let primes = {
  *[Symbol.iterator]() {
    let candidate = 2
    while (true) {
      if (isPrime(candidate)) yield candidate
        candidate++
    }
  }
}

for (const [i, prime] of eachWithIndex(primes)) {
  console.log(i, prime)
  if (i === 100) break
}


আপনার কেবলমাত্র একটি ফাংশনের eachWithIndex[Symbol.iterator]পরিবর্তে কোনও ফাংশন থাকবে কেন eachWithIndex? eachWithIndexপুনরাবৃত্তিযোগ্য ইন্টারফেসটি সন্তুষ্ট করে না যা এর সম্পূর্ণ পয়েন্ট Symbol.iterator
রাই-

@ রাই- ভাল ক্যাচ, eachWithIndexপুনরাবৃত্তিযোগ্য গ্রহণ করতে এবং একটি ক্লোজড কম্পোজিটকে পুনরাবৃত্তযোগ্য হিসাবে ফিরিয়ে দেওয়া হয়েছে।
akurtser

1

প্রত্যেকটি পোস্ট করা খুব ভাল উত্তরের উপরে আমি যুক্ত করতে চাই যে সর্বাধিক পারফরম্যান্ট সমাধান ইএস 6 entries। এটি এখানে অনেক দেব- দেবীর পক্ষে বিপরীতমুখী বলে মনে হচ্ছে, তাই আমি এই পারফেক্ট বেনচামার্ক তৈরি করেছি

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

এটি 6 গুন দ্রুত faster মূলত কারণগুলির প্রয়োজন হয় না: ক) একাধিকবার অ্যারে অ্যাক্সেস করুন এবং, খ) সূচকটি কাস্ট করুন।

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