জাভাস্ক্রিপ্টে নেস্টেড লুপগুলি ভাঙ্গার সর্বোত্তম উপায় কী?


448

জাভাস্ক্রিপ্টে নেস্টেড লুপগুলি ভেঙে যাওয়ার সর্বোত্তম উপায় কী?

//Write the links to the page.
for (var x = 0; x < Args.length; x++)
{
   for (var Heading in Navigation.Headings)
   {
      for (var Item in Navigation.Headings[Heading])
      {
         if (Args[x] == Navigation.Headings[Heading][Item].Name)
         {
            document.write("<a href=\"" 
               + Navigation.Headings[Heading][Item].URL + "\">" 
               + Navigation.Headings[Heading][Item].Name + "</a> : ");
            break; // <---HERE, I need to break out of two loops.
         }
      }
   }
}

লুপগুলি ভেঙে দেওয়া এবং কোডের ব্লকগুলি আউট করার জন্য এখানে উদাহরণ রয়েছে: মার্সিন-
শেভেডজুক.

উত্তর:


1032

পার্লের মতো,

loop1:
    for (var i in set1) {
loop2:
        for (var j in set2) {
loop3:
            for (var k in set3) {
                break loop2;  // breaks out of loop3 and loop2
            }
        }
    }

EMCA-262 বিভাগ 12.12 বিভাগে সংজ্ঞায়িত হিসাবে। [এমডিএন ডক্স]

সি থেকে পৃথক, এই লেবেলগুলি কেবলমাত্র জাভাস্ক্রিপ্টে নেই continueএবং এর জন্য ব্যবহার করা যেতে পারে ।breakgoto


387
ডাব্লুটিএফ কেন আমার 3 বছরের মধ্যে জাভাস্ক্রিপ্টের সাথে কোথাও এটি ব্যবহার হতে দেখেনি: / ..
সালমান ভন আব্বাস

39
এমডিএন খালি পাঠযোগ্যতার কারণে "লেবেল ব্যবহার এড়াতে" বলেছে। কেন এটি 'পঠনযোগ্য' নয়? কারণ অবশ্যই এগুলি কেউ ব্যবহার করে না। তবে কেন তারা সেগুলি ব্যবহার করে না? ...
এক্সএমএল

7
@ ওয়েব_ডিজাইনার আমি বিশ্বাস করি যে আপনার মন্তব্যটি পুরানো। এমডিএন ডক্সে কোথাও এটি "লেবেল ব্যবহার এড়াতে" বলা হয় না। আপনার মন্তব্য সংশোধন বা অপসারণ বিবেচনা করুন।
বিন বিয়ান

8
পুনঃটুইট করেছেন এটি আরও সহজ উত্তর বলে মনে হচ্ছে না এবং আপত্তিজনকভাবে উন্মুক্ত নয় কারণ এটি কেবলমাত্র continueএবং কেবল উপলভ্য break
গ্যারি উইলব্বি

29
@ জুরমিপুইয়েট - ডাউন ভোট দেওয়ার জন্য আপনার যুক্তি অজানা এবং অযৌক্তিক। এটি ওপির প্রশ্নের পুরোপুরি উত্তর দেয়। প্রশ্নযোগ্যতা সম্পর্কিত আপনার মতামত নিয়ে উদ্বিগ্ন নয়। সম্প্রদায়কে সহায়তা করার জন্য আপনার পদ্ধতির পুনর্বিবেচনা করুন।
দেমবিনস্কি

168

এটি একটি ফাংশন এবং তারপর ঠিক মোড়ানো return


12
আমি এই উত্তরটি গ্রহণ করতে পছন্দ করি কারণ এটি সহজ এবং একটি মার্জিত ফ্যাশনে প্রয়োগ করা যেতে পারে। আমি পুরোপুরি গোটোর ঘৃণা করি এবং তাদের খারাপ অনুশীলন বিবেচনা করি ( খুলতে পারে ), এফিমিয়েন্টের খুব কাছাকাছি is ; ও)
গ্যারি উইলফোবি

16
আইএমও, গোটো যতক্ষণ না তারা স্ট্রাকচারিং ভঙ্গ করে না ঠিক আছে fine কিন্তু প্রত্যেকের নিজের!
প্রথমবার

31
লুপগুলির জন্য লেবেলগুলিতে GOTO এর বাক্য বিন্যাস ব্যতীত আর কিছু মিল নেই । এগুলি কেবল বাহ্যিক লুপগুলি থেকে বিরতি দেওয়ার বিষয়। অন্তঃপুরের লুপটি ভাঙতে আপনার কোনও সমস্যা নেই, তাই না? তাহলে বাইরের লুপগুলি ভাঙতে আপনার কেন সমস্যা হচ্ছে?
জন স্মিথ

11
দয়া করে অন্য উত্তরটি গ্রহণ করার বিষয়টি বিবেচনা করুন। অ্যান্ড্রু হেজেস মন্তব্যটির জন্য না হলে (ধন্যবাদ বিটিডাব্লু।), আমি ভাবতাম: আহা, তাই জাভাস্ক্রিপ্টটিতে এই বৈশিষ্ট্যটি নেই। এবং আমি বাজি রেখেছি সম্প্রদায়ের অনেকেই মন্তব্যটিকে উপেক্ষা করতে এবং ঠিক একইরকম মনে করতে পারে।
জন স্মিথ

11
সম্প্রদায়ের স্পষ্টত ভুল নির্বাচিত উত্তরকে ওভাররাইড করার জন্য স্ট্যাক ওভারফ্লোতে কোনও বৈশিষ্ট্য নেই কেন? : /
ম্যাট হাগিনস

85

আমি পার্টিতে কিছুটা দেরি করেছি তবে নিম্নলিখিতটি একটি ভাষা-অজ্ঞাতিক পদ্ধতি যা GOTO / লেবেল বা ফাংশন মোড়ানো ব্যবহার করে না:

for (var x = Set1.length; x > 0; x--)
{
   for (var y = Set2.length; y > 0; y--)
   {
      for (var z = Set3.length; z > 0; z--)
      {
          z = y = -1; // terminates second loop
          // z = y = x = -1; // terminate first loop
      }
   }
}

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


2
খোলার ব্রেসটি নতুন লাইনে থাকা উচিত নয়, কারণ জেএস বাস্তবায়ন পূর্ববর্তী লাইনের শেষে একটি কোলন sertোকাতে পারে।
ইভজেনি

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

9
এই পদ্ধতির বাইরে নরকের মন্তব্য করা নিশ্চিত করুন। এখানে কী চলছে তা অবিলম্বে সুস্পষ্ট নয়।
কিউস - মনিকা

1
সুন্দর এবং সহজ উত্তর। এটি উত্তর হিসাবে বিবেচনা করা উচিত, কারণ এটি সিপিইউ নিবিড় লুপগুলিকে স্ট্রেন করে না (যা ফাংশনগুলি ব্যবহারে সমস্যা) বা এটি লেবেলগুলি ব্যবহার করে না, যা সাধারণত পঠনযোগ্য হয় না বা কিছু বলে যেমন ব্যবহার করা উচিত নয়। :)
গিরিশ সাজ্টর

2
আমি কিছু অনুপস্থিত হতে পারি, তবে অভ্যন্তরীণ লুপটির সমস্যাটি ঘুরে দেখার জন্য যে পুনরাবৃত্তিটি শেষ করতে পেরে আপনি z এবং y সেট করার পরে আপনি একটি breakবা continueতত্ক্ষণাত রেখে দিতে পারেন ? আমি forলুপের শর্তগুলি কিক আউট করতে ব্যবহার করার ধারণাটিকে পছন্দ করি । মার্জিত তার নিজস্ব উপায়ে।
বেন সুতন

76

আমি বুঝতে পারি এটি একটি সত্যই পুরানো বিষয়, তবে যেহেতু আমার মানক পদ্ধতিটি এখনও এখানে আসে নি, আমি ভেবেছিলাম ভবিষ্যতের গুগলদের জন্য এটি পোস্ট করেছি।

var a, b, abort = false;
for (a = 0; a < 10 && !abort; a++) {
    for (b = 0; b < 10 && !abort; b++) {
        if (condition) {
            doSomeThing();
            abort = true;
        }
    }
}

2
যদি নেস্টেড লুপটির প্রথম পুনরাবৃত্তিতে conditionমূল্যায়ন trueহয় তবে আপনি abortপ্রতিটি বারের মানটি পরীক্ষা করে এখনও 10 টি পুনরাবৃত্তির মধ্য দিয়ে চলেছেন । এটি 10 ​​টি পুনরাবৃত্তির জন্য কোনও পারফরম্যান্স সমস্যা নয়, তবে এটি 10,000, বলুন।
রোবস্তো

7
না, এটি উভয় লুপ থেকে বের হচ্ছে। এখানে বিক্ষোভকারী মূর্ছা । আপনি কোন শর্তটি নির্ধারণ করেন না কেন, এটি পূরণের পরে এটি বেরিয়ে আসছে।
zord

4
অপ্টিমাইজেশন একটি বিরতি যুক্ত করা হবে; abort স্থাপন পরে = সত্য; এবং অপসারণ! চূড়ান্ত লুপ থেকে গর্ভপাত শর্ত পরীক্ষা।
xer21

1
আমি এটি পছন্দ করি তবে আমি মনে করি আপনি সাধারণ অর্থে আপনি প্রচুর অপ্রয়োজনীয় প্রক্রিয়াকরণ করবেন - এটি প্রতিটি পুনরুক্তির প্রতিটি পুনরাবৃত্তির মূল্যায়ন abortএবং ভাব প্রকাশের জন্য। সাধারণ
দৃশ্যে

1
আপনি কি ছেলেরা 10000 বার একক বুলিয়ান মান চেক করা দ্রুত বা ধীর তা নিয়ে বিতর্ক করছেন? 100 মিলিয়ন বার / দীর্ঘশ্বাস চেষ্টা করুন
ফেবস্প্রো

40
var str = "";
for (var x = 0; x < 3; x++) {
    (function() {  // here's an anonymous function
        for (var y = 0; y < 3; y++) {
            for (var z = 0; z < 3; z++) {
                // you have access to 'x' because of closures
                str += "x=" + x + "  y=" + y + "  z=" + z + "<br />";
                if (x == z && z == 2) {
                    return;
                }
            }
        }
    })();  // here, you execute your anonymous function
}

এটা কেমন ছিল? :)


2
আমি বুঝতে পেরেছিলাম যে সুইলিয়ামগুলি এটাই পেয়েছিল
হারলে ৩৩৩

18
লুপটি বড় হলে এটি উল্লেখযোগ্য রানটাইম ব্যয় যুক্ত করে - জাভাস্ক্রিপ্ট ইন্টারপ্রেটার / সংকলক (বা এই দিনগুলিতে "বোধক", উভয়ের সংমিশ্রণ) দ্বারা ফাংশনটির জন্য একটি নতুন এক্সিকিউশন কনটেক্সট তৈরি করতে হবে (এবং জিসি দ্বারা মুক্তি পেয়েছে) must প্রতি একক সময়.
মারে

2
এটি আসলে বেশ বিপজ্জনক কারণ কিছু অদ্ভুত জিনিস ঘটতে পারে যা আপনি প্রত্যাশা করছেন না। বিশেষত, ভের সাথে তৈরি বন্ধের কারণে xলুপের মধ্যে কোনও যুক্তি যদি পরবর্তী সময়ে x রেফারেন্স করে (উদাহরণস্বরূপ এটি একটি অভ্যন্তরীণ বেনামে ফাংশন সংজ্ঞায়িত করে যা পরে সংরক্ষণ করা হয় এবং এক্সিকিউট করা হয়), এক্সের মানটি যাই হোক না কেন হবে ছিল শেষ লুপ না সূচক যে ফাংশন সময় সংজ্ঞায়িত হয়েছিল। (
cont'd

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

2
পাশাপাশি, আমি মনে করি পাঠযোগ্যতার জিনিসটি সম্পূর্ণ বাজে। এটি কোনও লেবেলের চেয়ে আরও অস্পষ্ট। লেবেলসমূহ শুধুমাত্র হিসেবে দেখা হয় অপাঠ্য কারণ কেউ কখনো তাদের ব্যবহার করে।
কিউস - মনিকা

39

খুবই সাধারণ:

var a = [1, 2, 3];
var b = [4, 5, 6];
var breakCheck1 = false;

for (var i in a) {
    for (var j in b) {
        breakCheck1 = true;
        break;
    }
    if (breakCheck1) break;
}

আমি সম্মত হলাম এটি সর্বোত্তম, ফাংশন ওয়ান স্কেল করে না, লুপের জন্য সমস্ত মোড়ানো যদি স্কেল না করে অর্থাত্ এটি পড়তে এবং ডিবাগ করা শক্ত করে তোলে .... এটি দুর্দান্ত। আপনি কেবল ওয়ার লুপ 1, লুপ 2, লুপ 3 ঘোষণা করতে পারেন এবং শেষে সামান্য স্টেটমেন্ট যুক্ত করতে পারেন। একাধিক লুপগুলি ভাঙতে আপনার যেমন কিছু করতে হবেloop1=loop2=false;
মুহাম্মদ উমার

22

জাভাস্ক্রিপ্টে নেস্টেড লুপগুলি ভাঙ্গার পাঁচটি উপায় এখানে রয়েছে:

1) শেষ পিতাম (গুলি) লুপ সেট করুন

for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
        {
            i = 5;
            break;
        }
    }
}

2) লেবেল ব্যবহার করুন

exit_loops:
for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
            break exit_loops;
    }
}

3) পরিবর্তনশীল ব্যবহার করুন

var exit_loops = false;
for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
        {
            exit_loops = true;
            break;
        }
    }
    if (exit_loops)
        break;
}

4) স্ব নির্বাহ ফাংশন ব্যবহার করুন

(function()
{
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
             if (j === 2)
                 return;
        }
    }
})();

5) নিয়মিত ফাংশন ব্যবহার করুন

function nested_loops()
{
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
             if (j === 2)
                 return;
        }
    }
}
nested_loops();

1
@ উইক আমি যথেষ্ট রাজি হতে পারি না! এটি একটি লজ্জাজনক জাভাস্ক্রিপ্টের break 2;পিএইচপি-তে কেবল একটি বাক্য গঠন নেই । কোনও লুপ লেবেল নেই, কোন ফাংশন নেই, নেই-যদি অন্য চেক হয় না, লুপ ভেরিয়েবলগুলির ব্লাস্টিং / টেম্পারিং নয় - কেবল পরিষ্কার বাক্য গঠন!
জে দধনিয়া


14

কোনও বিরতি ব্যবহার না করা, কোনও বাতিল বিহীন ফ্ল্যাশ এবং কোনও অতিরিক্ত শর্ত পরীক্ষা করা যায় না। Number.MAX_VALUEযখন শর্তটি পূরণ হয় তখন এই সংস্করণটি লুপ ভেরিয়েবলগুলিকে (তাদের তৈরি করে ) বিস্ফোরিত করে এবং সমস্ত লুপগুলি মার্জিতভাবে শেষ করতে বাধ্য করে।

// No breaks needed
for (var i = 0; i < 10; i++) {
  for (var j = 0; j < 10; j++) {
    if (condition) {
      console.log("condition met");
      i = j = Number.MAX_VALUE; // Blast the loop variables
    }
  }
}

হ্রাস-প্রকার নেস্টেড লুপগুলির জন্য একই ধরণের উত্তর ছিল, তবে এটি সরল লুপগুলির জন্য প্রতিটি লুপের সমাপ্তির মান বিবেচনার প্রয়োজন ছাড়াই নেস্টেড লুপগুলি ইনক্রিমেন্টিংয়ের জন্য কাজ করে।

আরেকটি উদাহরণ:

// No breaks needed
for (var i = 0; i < 89; i++) {
  for (var j = 0; j < 1002; j++) {
    for (var k = 0; k < 16; k++) {
      for (var l = 0; l < 2382; l++) {
        if (condition) {
          console.log("condition met");
          i = j = k = l = Number.MAX_VALUE; // Blast the loop variables
        }
      }
    }
  }
}

4

লুপগুলি তাদের শেষ সীমাতে ঠেলাঠেলি সম্পর্কে কীভাবে

    for(var a=0; a<data_a.length; a++){
       for(var b=0; b<data_b.length; b++){
           for(var c=0; c<data_c.length; c++){
              for(var d=0; d<data_d.length; d++){
                 a =  data_a.length;
                 b =  data_b.length;
                 c =  data_b.length;
                 d =  data_d.length;
            }
         }
       }
     }

1
আমি মনে করি ড্রাকসের উত্তরটির আরও যুক্তিযুক্ত এবং পরিষ্কার পদ্ধতিতে একই যুক্তি রয়েছে।
ইঞ্জিনিয়ার টোস্ট

একদম অসাধারণ!
জিওইউজ

3

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

do ->
  for a in first_loop
    for b in second_loop
      if condition(...)
        return

... যাতে লুপগুলি থেকে বেরিয়ে আসার জন্য আপনি কেবল "রিটার্ন" ব্যবহার করতে পারেন।


এটি এক নয়। আমার মূল উদাহরণটিতে forদুটি নয় তিনটি লুপ রয়েছে ।
গ্যারি উইলফোবি

2

আমি ভেবেছিলাম আমি একটি কার্যকরী-প্রোগ্রামিং পদ্ধতির দেখাব। আপনি আমার সমাধান হিসাবে নেস্টেড অ্যারে.প্রোটোটাইপ.সোম () এবং / অথবা অ্যারে.প্রোটোটাইপ.এভিয়ারি () ফাংশনগুলি ভেঙে ফেলতে পারেন। এই পদ্ধতির একটি অতিরিক্ত সুবিধা হ'ল Object.keys()কেবলমাত্র একটি অবজেক্টের নিজস্ব গণ্য বৈশিষ্ট্যগুলি গণনা করে, "প্রোটোটাইপ শৃঙ্খলে" একটি ইন-লুপ লুপও গণ্য করে "

ওপি'র সমাধানের কাছে:

    Args.forEach(function (arg) {
        // This guard is not necessary,
        // since writing an empty string to document would not change it.
        if (!getAnchorTag(arg))
            return;

        document.write(getAnchorTag(arg));
    });

    function getAnchorTag (name) {
        var res = '';

        Object.keys(Navigation.Headings).some(function (Heading) {
            return Object.keys(Navigation.Headings[Heading]).some(function (Item) {
                if (name == Navigation.Headings[Heading][Item].Name) {
                    res = ("<a href=\""
                                 + Navigation.Headings[Heading][Item].URL + "\">"
                                 + Navigation.Headings[Heading][Item].Name + "</a> : ");
                    return true;
                }
            });
        });

        return res;
    }

সমাধান যা শিরোনাম / আইটেমগুলির মাধ্যমে পুনরাবৃত্তি হ্রাস করে:

    var remainingArgs = Args.slice(0);

    Object.keys(Navigation.Headings).some(function (Heading) {
        return Object.keys(Navigation.Headings[Heading]).some(function (Item) {
            var i = remainingArgs.indexOf(Navigation.Headings[Heading][Item].Name);

            if (i === -1)
                return;

            document.write("<a href=\""
                                         + Navigation.Headings[Heading][Item].URL + "\">"
                                         + Navigation.Headings[Heading][Item].Name + "</a> : ");
            remainingArgs.splice(i, 1);

            if (remainingArgs.length === 0)
                return true;
            }
        });
    });

2

ইতিমধ্যে swilliams দ্বারা ইতিমধ্যে উল্লিখিত , কিন্তু নীচে একটি উদাহরণ সহ (জাভাস্ক্রিপ্ট):

// Function wrapping inner for loop
function CriteriaMatch(record, criteria) {
  for (var k in criteria) {
    if (!(k in record))
      return false;

    if (record[k] != criteria[k])
      return false;
  }

  return true;
}

// Outer for loop implementing continue if inner for loop returns false
var result = [];

for (var i = 0; i < _table.length; i++) {
  var r = _table[i];

  if (!CriteriaMatch(r[i], criteria))
    continue;

  result.add(r);
}

0

হুমম হি 10 বছরের পুরনো পার্টিতে?

আপনার জন্য কিছু শর্ত রাখেন না কেন?

var condition = true
for (var i = 0 ; i < Args.length && condition ; i++) {
    for (var j = 0 ; j < Args[i].length && condition ; j++) {
        if (Args[i].obj[j] == "[condition]") {
            condition = false
        }
    }
}

এই আপনি চাইলে থামুন

আমার ক্ষেত্রে, টাইপসক্রিপ্ট ব্যবহার করে, আমরা কিছু () ব্যবহার করতে পারি যা অ্যারের মধ্য দিয়ে যায় এবং শর্ত পূরণ হওয়ার পরে বন্ধ হয়ে যায় তাই আমার কোডটি এর মতো হয়ে যায়:

Args.some((listObj) => {
    return listObj.some((obj) => {
        return !(obj == "[condition]")
    })
})

এটির মতো শর্তটি পূরণের পরে লুপটি বন্ধ হয়ে গেল

অনুস্মারক: এই কোডটি টাইপস্ক্রিপ্টে চলে


-3
XXX.Validation = function() {
    var ok = false;
loop:
    do {
        for (...) {
            while (...) {
                if (...) {
                    break loop; // Exist the outermost do-while loop
                }
                if (...) {
                    continue; // skips current iteration in the while loop
                }
            }
        }
        if (...) {
            break loop;
        }
        if (...) {
            break loop;
        }
        if (...) {
            break loop;
        }
        if (...) {
            break loop;
        }
        ok = true;
        break;
    } while(true);
    CleanupAndCallbackBeforeReturning(ok);
    return ok;
};

9
এটি মূলটিকে আরও বিভ্রান্ত দেখাচ্ছে looks
ক্রিশ্চিয়ানো ফন্টেস

21
উত্তর আধুনিক কবিতার মতো
ডায়গার্কাম

ভোট দেওয়া হয়েছে কারণ একটি করণ সময় এই ধরণের দৃশ্যে পরিণত হয় (বেশিরভাগ ক্ষেত্রে)।
কোডি

-4

সর্বোত্তম উপায়টি হল -
1) উভয় অ্যারে বাছাই করুন যা প্রথম এবং দ্বিতীয় লুপে ব্যবহৃত হয়।
2) যদি আইটেমটি ম্যাচ করে তবে অভ্যন্তরীণ লুপটি ভেঙে সূচকের মানটি ধরে রাখুন।
3) পরবর্তী পুনরাবৃত্তির শুরু হলে হোল্ড ইনডেক্স মান সহ অভ্যন্তরীণ লুপ শুরু করুন।

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