কার্সারে "চালিয়ে যান"। প্রতিটি ()


278

আমি meteor.js এবং মঙ্গোডিবি ব্যবহার করে একটি অ্যাপ তৈরি করছি এবং আমার কার্সার সম্পর্কে একটি প্রশ্ন আছে for আমি প্রত্যেকটি পুনরুক্তির শুরুতে কিছু শর্তগুলি পরীক্ষা করতে চাই এবং তারপরে যদি অপারেশনটি না করতে হয় তবে উপাদানটি এড়িয়ে যেতে পারি যাতে আমি কিছুটা সময় বাঁচাতে পারি।

আমার কোডটি এখানে:

// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection.forEach(function(element){
  if (element.shouldBeProcessed == false){
    // Here I would like to continue to the next element if this one 
    // doesn't have to be processed
  }else{
    // This part should be avoided if not neccessary
    doSomeLengthyOperation();
  }
});

আমি জানি আমি কার্সার.ফাইন্ড ()। আনয়ন () ব্যবহার করে অ্যারেতে কার্সারটি চালু করতে পারি এবং তারপরে নিয়মিত ফর্ম-লুপ ব্যবহার করে উপাদানগুলির পুনরাবৃত্তি করতে পারি এবং চালিয়ে যেতে এবং স্বাভাবিকভাবে বিরতি ব্যবহার করতে পারি তবে আমি আগ্রহী যদি ফরইচ-এ ব্যবহার করার মতো কিছু আছে তবে ( )।

উত্তর:


560

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

elementsCollection.forEach(function(element){
  if (!element.shouldBeProcessed)
    return; // stop processing this iteration

  // This part will be avoided if not neccessary
  doSomeLengthyOperation();
});

18
আপনি কি জানেন যে "ব্রেক" কী হতে পারে তবে যদি চালিয়ে যাওয়া কেবল "ফিরতি;" হয়।
21

5
আমি মঙ্গোডিবি ব্যবহার করি না সুতরাং এটির ডকুমেন্টেশনগুলি পড়া হয়নি, তবে এটি সম্ভব যে এটি একটি জিকুয়েরি লুপের return false;সমতুল্য )। অবশ্যই যে কেউ break;.each().forEach()
মঙ্গোডিবি

9
@ টানুন 0 আপনি .forEach () এর প্রতিস্থাপন হিসাবে .some () ব্যবহার করতে পারেন, যা আপনাকে লুপ ভাঙতে মিথ্যা ফিরতে সক্ষম করে।
অ্যান্ড্রু

6
@ অ্যান্ড্রু আপনি ব্যবহার করতে পারেন some, কেবল সচেতন হন যে আপনি কোনও ফাংশনকে (বা সৃজনশীলভাবে ব্যবহার করছেন) অপব্যবহার করছেন যা এই উপাদানগুলির সাথে শর্তের সাথে মেলে কিনা তা জানানোর উদ্দেশ্যে। লোকেরা যখন mapফলাফলটি ব্যবহার করতে এবং এড়িয়ে যাওয়ার ফলাফলটি দেখতে পায় (তাদের ব্যবহার করা উচিত ছিল forEach)It's এটি শব্দার্থবিজ্ঞানের কারণে, আপনি someযখন সত্যই ফলাফল সম্পর্কে চিন্তা করেন না তখন আপনি কেন ব্যবহার করছেন তা জানতে লোককে দুবার তাকাতে হবে
জুয়ান মেন্ডেস

1
@ অ্যান্ড্রু দুর্দান্ত টিপ, তবে এটি return trueকিছু লুপটি ভেঙে দেবে
ডেভিস্টারের

11

আমার মতে সবচেয়ে ভালো ব্যবহার করে এই অর্জন করার জন্য filter পদ্ধতি যেমন একটি ফিরতে অর্থহীন এর forEachব্লক; আপনার স্নিপেটে উদাহরণের জন্য:

// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection
.filter(function(element) {
  return element.shouldBeProcessed;
})
.forEach(function(element){
  doSomeLengthyOperation();
});

এটি আপনার সঙ্কুচিত করবে elementsCollectionএবং filtredপ্রক্রিয়া করা উচিত এমন উপাদানগুলিকে ঠিক রাখবে ।


3
এটি পাওয়া উপাদানগুলিকে দুবার পুনরুক্ত করবে, একবারে filterএবং দ্বিতীয়টিতে এটি forEachযদি বড় সংগ্রহ হয় তবে এটি খুব অকার্যকর হবে
ডেমেন্টিক

1
আপনি ঠিক, কিন্তু আমি এটা এই সময় জটিলতা হবে হিসাবে একটি বড় চুক্তি মনে করি না O(2n)যা বিবেচনা করা যেতে পারে O(n)
রামি টেমার

2
বিবেচনা করে এসও অন্যরা ব্যবহার করছেন, কেবল ওপি নয়, কেবল পোস্ট করার উদ্দেশ্যে সমাধান পোস্ট করে, ভালোর চেয়ে আরও বেশি ক্ষতি তৈরি করে। উপরের উত্তরটি এটি একটি পুনরাবৃত্তিতে করে এবং এটি করার rightউপায়।
ডেমেন্টিক

দ্রষ্টব্য যে ও.পি. এর সংগ্রহটি কোনও অ্যারে নয়, এটি একটি মঙ্গো ডিবি কার্সার অবজেক্ট, যার কোনও .filter()পদ্ধতি আছে বলে মনে হচ্ছে না , তাই আপনাকে .toArray()পারার আগে আপনাকে তার পদ্ধতিটি কল করতে হবে.filter()
nnnnnn

7

এখানে এর পরিবর্তে for ofএবং এর continueপরিবর্তে একটি সমাধান রয়েছে forEach:


let elementsCollection = SomeElements.find();

for (let el of elementsCollection) {

    // continue will exit out of the current 
    // iteration and continue on to the next
    if (!el.shouldBeProcessed){
        continue;
    }

    doSomeLengthyOperation();

});

এই একটি বিট আরো দরকারী হতে পারে আপনি আপনার লুপ যা ভিতরে কাজ করে না ভিতরে অ্যাসিঙ্ক্রোনাস ফাংশন ব্যবহার করার দরকার হয় forEach। উদাহরণ স্বরূপ:


(async fuction(){

for (let el of elementsCollection) {

    if (!el.shouldBeProcessed){
        continue;
    }

    let res;

    try {
        res = await doSomeLengthyAsyncOperation();
    } catch (err) {
        return Promise.reject(err)
    }

});

})()

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