কৌণিক জেএস বিরতি forEach


256

আমার একটি কৌণিক ফোরচ লুপ রয়েছে এবং আমি কোনও মানটির সাথে মিলে লুপ থেকে ব্রেক করতে চাই। নিম্নলিখিত কোডটি কাজ করে না।

angular.forEach([0,1,2], function(count){
  if(count == 1){
    break;
  }
});

আমি এটি কিভাবে পেতে পারি?


1
আমি বুঝতে পারি না আপনি লুপে যাওয়ার পরিবর্তে কেন মান খুঁজে পাবেন না। আপনার দেওয়া উদাহরণটি পুরো গল্পটি বলছে না, তবে @ আমান নীচে যা বলেছেন তা আমি বরং করব। নীচে উল্লিখিত হিসাবে লুপে কেন যান এবং প্রতিবার যখন কিছু () ঠিক এটি আরও মার্জিত ফ্যাশনে করেন তখন চেক চালান। মনে রাখবেন যে আপনি যদি জাভাস্ক্রিপ্টকে একটি কার্যকরী ভাষা হিসাবে বিবেচনা করেন তবে এগুলি / যখন / ব্রেক ব্রেক স্ট্রাকচার ধরণের জন্য ব্যবহার করার কোনও অর্থ হওয়া উচিত না। সে কারণেই ভবিষ্যদ্বাণী, অনুসন্ধান, কিছু ইত্যাদির উপস্থিতি রয়েছে
অ্যাড্রিয়ান রদ্রিগেজ

উত্তর:


264

এটি করার কোনও উপায় নেই। Https://github.com/angular/angular.js/issues/263 দেখুন । আপনি কী করছেন তার উপর নির্ভর করে আপনি লুপের শরীরে না গিয়ে বুলিয়ান ব্যবহার করতে পারেন। কিছুটা এইরকম:

var keepGoing = true;
angular.forEach([0,1,2], function(count){
  if(keepGoing) {
    if(count == 1){
      keepGoing = false;
    }
  }
});

45
আমি বরং কেবল !keepGoing && return;ফাংশনের শীর্ষে একটি কোড যুক্ত করব, কম কোড।
অ্যান্ড্রু জোসলিন

46
এটি সর্বোত্তম অনুশীলন নয়, এখানে প্রতিটি লুপ কখনই ভেঙে যায় না, এবং কৌণিক ভাঙার কিছুই নেই। লুপের জন্য নেটিভ কৌণিক.এফের চেয়ে প্রায় 90% দ্রুত। সুতরাং আপনি যখন শর্তের ম্যাচে ব্রেক করতে চান তখন লুপের জন্য নেটিভ ব্যবহার করা ভাল। ধন্যবাদ
নিশ্চীত ধনানী

xcatly যেখানে আমি আটকেছি ... এবং এটি সাহায্য করেছে..এ এক টন ধন্যবাদ ... যাইহোক আমি প্রতিটি লুপ অবিচ্ছেদ্য করার কারণ জানতে চাই। যদি কোনও হয়
সৌরভ তিওয়ারি

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয় কারণ এটি forEach লুপটি ভেঙে দেয় না। লুপের অভ্যন্তরে সমস্ত যুক্তি প্রয়োগ না করার এটি দুর্দান্ত উপায়।
নেবুলোসর

296

angular.forEachলুপ একটি শর্ত ম্যাচ ভাঙ্গতে পারে না।

আমার ব্যক্তিগত পরামর্শটি হ'ল পরিবর্তে লুপের জন্য একটি নেটিভ ব্যবহার করুন angular.forEach

লুপের জন্য NATIVE প্রায় 90% দ্রুত তবে লুপগুলির জন্য অন্যান্য।

লুপ বিরতির জন্য, লুপ পরীক্ষার ফলাফলের জন্য

আঙ্গুলের লুপের জন্য ব্যবহার করুন:

var numbers = [0, 1, 2, 3, 4, 5];

for (var i = 0, len = numbers.length; i < len; i++) {
  if (numbers[i] === 1) {
    console.log('Loop is going to break.'); 
    break;
  }
  console.log('Loop will continue.');
}

1
এটি আমার পক্ষে কাজ করে না। এটি সবই লুপের এই নির্দিষ্ট পুনরাবৃত্তিটি শেষ করে finish তবে তারপরে এটি পরবর্তী পুনরাবৃত্তির দিকে চলে যায়।
বেন

1
@ বেন, দুঃখিত বেন, এটি আমার ভুল ছিল তবে আমি দীর্ঘ গবেষণার পরে আমার উত্তর আপডেট করছি। আমি আশা করি এটা তোমাকে সাহায্য করবে . আপনাকে ধন্যবাদ
নিশ্চীত ধনানী

1
@ এলগামা: - আপনার মামলা কি ??
নিশ্চিত ধনানী

3
আপনার কোন ফাংশনটি বেছে নেওয়া উচিত তা সিদ্ধান্ত নিতে আপনার নিজের ব্রাউজারে এটি পরীক্ষা করুন jsperf.com/angular-foreach-performance । আমি আইই ১১ তে পরীক্ষা করেছি এবং এটি স্ক্রিনশটের মতোই দ্রুতও। এছাড়াও অ্যারে.সোম () পরীক্ষা করা হয়েছে তবে এটি ইই 11 এ আরে.ফোরএচ () এর পরে ধীরে ধীরে তবে কৌণিক.ফৌচ ;-) এর চেয়ে দ্রুততর হতে পারে। বা এটি এখানে পরীক্ষা করুন jsperf.com/angular-foreach-vs-native (সমস্ত ক্রেডিট মূল লেখকের কাছে যায়, আমাকে নয় ;-))
সেবাস্তিয়ান

6
এমনকি jsperf দিয়ে আপনি "নেটিভ ফর প্রায় 90% দ্রুত" বলতে পারবেন না। আপনার দৃশ্যে এটি অত্যন্ত নির্ভর করে যে অভ্যন্তরীণ ফাংশনটি কার্যকর করা কত ব্যয়বহুল এবং লুপ (ব্রেক) তাড়াতাড়ি বের করে দিয়ে কত মৃত্যুদণ্ড কার্যকর করা যায় on
hgoebl

22

দয়া করে ফরইচ এর কয়েকটি বা প্রতিটি উদাহরণ ব্যবহার করুন,

Array.prototype.some:
some is much the same as forEach but it break when the callback returns true

Array.prototype.every:
every is almost identical to some except it's expecting false to break the loop.

কারও জন্য উদাহরণ:

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.some(function (value, index, _ary) {
    console.log(index + ": " + value);
    return value === "JavaScript";
});

প্রত্যেকের জন্য উদাহরণ:

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.every(function(value, index, _ary) {
    console.log(index + ": " + value);
    return value.indexOf("Script") > -1;
});

আরও তথ্য খুঁজুন
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/


না @ অ্যাঞ্জেলস.মোরেনো, প্রত্যেকে হাতে বিশেষভাবে মামলার জন্য ডিজাইন করা পদ্ধতির পরিবর্তে স্থানীয় ভেরিয়েবল ব্যবহার করতে পছন্দ করে
ওদেড নিভ

18

অ্যারে কিছু পদ্ধতি ব্যবহার করুন

 var exists = [0,1,2].some(function(count){
      return count == 1
 });

বিদ্যমান সত্য ফিরে আসবে, এবং আপনি এটি আপনার ফাংশনে পরিবর্তনশীল হিসাবে ব্যবহার করতে পারেন

if(exists){
    console.log('this is true!')
}

অ্যারে কিছু পদ্ধতি - জাভাস্ক্রিপ্ট


4
আমার জন্য, কেবলমাত্র ব্যবহারের কারণ angular.forEach()হ'ল আমাকে আইই 8 সমর্থন করতে হবে, যার নেই Array.forEach()... বা Array.some()
বেনেট ম্যাকএলউই

2
আপনি সহজেই অ্যারে পলফিল করতে পারেন for পৃষ্ঠার নীচের
অংশটি

6

যতদূর আমি জানি, কৌণিক এই জাতীয় ফাংশন সরবরাহ করে না। আপনি find()এটির জন্য আন্ডারস্কোরের ফাংশনটি ব্যবহার করতে চাইতে পারেন (এটি মূলত একটি forEach যা ফাংশনটি সত্য হয়ে গেলে লুপটি ভেঙে যায়)।

http://underscorejs.org/#find


এটি সমস্যাটি দেরিতেই সমাধান করতে পারে তবে এটি লুপটি ভাঙ্গবে না।
এলিস চ্যান্ট

বা স্থানীয় লুপের জন্য
শান্তি

6

যদি আপনি অ্যাংুলারজেএস এর সাথে মিলিয়ে jQuery (অতএব jqLite নয়) ব্যবহার করেন তবে আপনি $ .each দিয়ে পুনরাবৃত্তি করতে পারেন - যা বুলিয়ান রিটার্ন মান অভিব্যক্তির উপর ভিত্তি করে ব্রেকিং এবং অব্যাহত রাখে।

JSFiddle:

http://jsfiddle.net/JEcD2/1/

javascript:

var array = ['foo', 'bar', 'yay'];
$.each(array, function(index, element){
    if (element === 'foo') {
        return true; // continue
    }
    console.log(this);
    if (element === 'bar') {
        return false; // break
    }
});

বিঃদ্রঃ:

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

"ForEach লুপ থামাতে বা ভাঙ্গার কোনও উপায় নেই। সমাধানটি অ্যারে.এভারি বা অ্যারে.সোম ব্যবহার করা হয়"

নিম্নলিখিত উদাহরণগুলি এমডিএন সরবরাহ করেছে:

Array.some:

function isBigEnough(element, index, array){
    return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true

Array.every:

function isBigEnough(element, index, array){
    return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true

6

কংক্রিটের সাহায্যে আপনি একটি forEachলুপ থেকে বেরিয়ে আসতে পারেন এবং যে কোনও জায়গাতেই একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন।

try {
   angular.forEach([1,2,3], function(num) {
      if (num === 2) throw Error();
   });
} catch(e) {
    // anything
}

তবে, যদি আপনি অন্য লাইব্রেরি ব্যবহার করেন বা আপনার নিজের ফাংশন, findএই ক্ষেত্রে একটি ফাংশন ব্যবহার করেন তবে এটি আরও ভাল ।


10
ঠিক আছে, আপনি প্রশ্নের উত্তর দিয়েছিলেন! আমি আশা করি যে কেউ এটি করেনি যদিও :)
জেসন কক্স

অযৌক্তিকভাবে একটি ব্যতিক্রম ছুঁড়ে ফেলা পরিস্থিতি সামাল দেওয়ার ভাল উপায় নয়। বরং সমাধান @ dnc253 দ্বারা উপলব্ধ পরীক্ষা stackoverflow.com/a/13844508/698127
Aamol

4

বিরতি হিসাবে এটি চেষ্টা করুন;

angular.forEach([0,1,2], function(count){
  if(count == 1){
    return true;
  }
});

3

অন্যান্য উত্তরগুলি যেমন বলেছে, কৌণিক এই কার্যকারিতা সরবরাহ করে না। jQuery তবে করে, এবং আপনি যদি jQuery এর পাশাপাশি অ্যাংুলার লোড করেছেন তবে আপনি এটি ব্যবহার করতে পারেন

jQuery.each ( array, function ( index, value) {
    if(condition) return false; // this will cause a break in the iteration
})

Http://api.jquery.com/jquery.each/ দেখুন


2
ওপি একটি
কৌণিক জেএস

3

সাধারণত জাভাস্ক্রিপ্টে "প্রতিটি" লুপ ভাঙার কোনও উপায় নেই। সাধারণত "শর্ট সার্কিট" পদ্ধতি ব্যবহার করা যা করা যায়।

    array.forEach(function(item) {
      // if the condition is not met, move on to the next round of iteration.
      if (!condition) return;

      // if the condition is met, do your logic here
      console.log('do stuff.')
    }


2

break প্রত্যেকের জন্য কৌণিক অর্জন করা সম্ভব নয়, প্রতিটি ক্ষেত্রে এটি করার জন্য আমাদের সংশোধন করতে হবে।

$scope.myuser = [{name: "Ravi"}, {name: "Bhushan"}, {name: "Thakur"}];  
                angular.forEach($scope.myuser, function(name){
                  if(name == "Bhushan") {
                    alert(name);
                    return forEach.break(); 
                    //break() is a function that returns an immutable object,e.g. an empty string
                  }
                });

এই উত্তরটি সম্পূর্ণ বলে মনে হচ্ছে না। break()সংজ্ঞায়িত করা দরকার কিনা বা এটি ইতিমধ্যে কৌনিকের অংশ বলে দয়া করে নির্দেশ করুন । না হলে সংজ্ঞা দিন।
জিওএডসিক

2

আপনি এটি ব্যবহার করতে পারেন:

var count = 0;
var arr = [0,1,2];
for(var i in arr){
   if(count == 1) break;
   //console.log(arr[i]);
}

1
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];
var keepGoing = true;
ary.forEach(function(value, index, _ary) {
    console.log(index)
    keepGoing = true;
    ary.forEach(function(value, index, _ary) {
        if(keepGoing){ 
            if(index==2){
                keepGoing=false;
            }
            else{
                console.log(value)
            }

        }      
    });
});

0
$scope.arr = [0, 1, 2];  
$scope.dict = {}
for ( var i=0; i < $scope.arr.length; i++ ) {
    if ( $scope.arr[i] == 1 ) {
        $scope.exists = 'yes, 1 exists';
        break;
    }
 }
 if ( $scope.exists ) {
     angular.forEach ( $scope.arr, function ( value, index ) {
                      $scope.dict[index] = value;
     });
 }

0

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


0

আমি বুঝতে পারি যে এটি পুরানো, তবে একটি অ্যারে ফিল্টার আপনার যা প্রয়োজন তা করতে পারে:

var arr = [0, 1, 2].filter(function (count) {
    return count < 1;
});

তারপরে আপনি চালাতে পারেন arr.forEachএবং অন্যান্য অ্যারে ফাংশনগুলি।

আমি বুঝতে পারি যে আপনি যদি লুপ ক্রিয়াকলাপগুলি পুরোপুরি কাটাতে চান তবে এটি সম্ভবত আপনি যা চান তা করবে না। তার জন্য আপনি সেরা ব্যবহার করুন while


0

এই উদাহরণ কাজ করে। চেষ্টা করে দেখুন

var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
  if(i === 1){
   break;
  }
}

1
আমি অনুমান করি যে সে forলুপ চায় না , তার ব্যবহারের ক্ষেত্রে সম্ভবত foreachএকটি প্রয়োজন নেইfor
হাসেন সিএইচ।

0

লুপটি ভাঙ্গতে রিটার্নটি ব্যবহার করুন।

angular.forEach([0,1,2], function(count){
  if(count == 1) {
    return;
  }
});

0
onSelectionChanged(event) {
    let selectdata = event['api']['immutableService']['gridOptionsWrapper']['gridOptions']['rowData'];
    let selected_flag = 0;

    selectdata.forEach(data => {
      if (data.selected == true) {
        selected_flag = 1;
      }
    });

    if (selected_flag == 1) {
      this.showForms = true;
    } else {
      this.showForms = false;
    }
}

-1

আমি returnপরিবর্তে ব্যবহার করতে হবে break

angular.forEach([0,1,2], function(count){
  if(count == 1){
    return;
  }
});

একটি যাদুমন্ত্র মত কাজ করে.


এটি কোনও বৈধ সমাধান নয়। চেহারা: ফাংশন পরীক্ষা () ular কৌণিক.ফর প্রতিটি ([1,2,3,4,5,6,7,8,9], ফাংশন (মান, সূচক) {যদি (মান == 2) ফিরে আসে; কনসোল.লগ (মান);})} আউটপুট:> টেস্ট (); 1 3 4 5 6 7 8 9
ওটাভিওডিক্যাম্পস

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