শর্ট সার্কিট অ্যারে.ফর প্রতিটি কল বিরতির মত


1568
[1,2,3].forEach(function(el) {
    if(el === 1) break;
});

আমি কীভাবে forEachজাভাস্ক্রিপ্টে নতুন পদ্ধতিটি ব্যবহার করে এটি করতে পারি ? আমি চেষ্টা করেছি return;, return false;এবং breakbreakক্রাশ হয় এবং returnপুনরাবৃত্তি চালিয়ে যাওয়া ছাড়া কিছুই করে না।


6
এটি লক্ষণীয় যে returnসত্যিকারভাবে পুনরাবৃত্তি চালিয়ে যাওয়ার সময় এটি কোনও ব্লকটিতে পরে যে কোড আসে তা এড়িয়ে যাবে। উদাহরণস্বরূপ এই কোড নিন: [1,2,3].forEach(function(el) { if(el === 2) { console.log(`Match on 2!`); return; } console.log(el); });লোকের console.log(el);এড়ানো হয়েছে যখন 2 মিলেছে হয় হবে।
শেন

5
টিএল; ডিআর: আমি আপনার বেশিরভাগ সময় সাশ্রয় করব। আমি ইদানীং প্রচুর জেএস ব্যবহার করছি। আপনি যে উত্তরটি খুঁজছেন সম্ভবত (28 এর বাইরে ...) এটি হ'ল স্ট্যাকওভারফ্লো.com
অ্যান্ড্রু

উত্তর:


2139

কোন বিল্ট-ইন এর ক্ষমতা breakমধ্যে forEach। মৃত্যুদন্ড কার্যকর করতে আপনাকে কোনও ধরণের ব্যতিক্রম ছুঁড়ে ফেলতে হবে। যেমন।

var BreakException = {};

try {
  [1, 2, 3].forEach(function(el) {
    console.log(el);
    if (el === 2) throw BreakException;
  });
} catch (e) {
  if (e !== BreakException) throw e;
}

জাভাস্ক্রিপ্ট ব্যতিক্রমগুলি ভয়ঙ্কর সুন্দর নয়। forআপনার যদি সত্যই breakএটির ভিতরে দরকার হয় তবে একটি traditional তিহ্যবাহী লুপটি আরও উপযুক্ত হতে পারে ।

ব্যবহার Array#some

পরিবর্তে, ব্যবহার করুন Array#some:

[1, 2, 3].some(function(el) {
  console.log(el);
  return el === 2;
});

এর কারণ হল কাজ someআয় trueযত তাড়াতাড়ি callbacks কোন হিসাবে, অ্যারে আদেশ, বিনিময়ে মৃত্যুদন্ড কার্যকর true, স্বল্প-পরিক্রমার বাকি সঞ্চালনের।

some, এর বিপরীতমুখী every(যা এটিকে থামবে return false), এবং forEachসমস্ত ECMAScript পঞ্চম সংস্করণ পদ্ধতি যা Array.prototypeব্রাউজারগুলিতে তারা অনুপস্থিত রয়েছে সেখানে যুক্ত করতে হবে ।


109
এটি লুপের জন্য কেবলমাত্র একটি সাধারণ ব্যবহারের চেয়ে বেশি পঠনযোগ্য বা তত বেশি পারফরম্যান্ট নয়। উত্তরটি "এই ক্ষেত্রে প্রত্যেকের জন্য ব্যবহার করবেন না" -১
বিটি

37
আমি মনে করি "কিছু" এখানে ঠিক আছে, কেন প্রারম্ভিক প্রস্থান অপ্টিমাইজেশন- ব্যবহার করবেন না
ক্রিসমার্ক

28
মানসিকতার জন্য ধন্যবাদ someএবং every, উত্তরে এটি শীর্ষে থাকা উচিত। লোকেরা কেন এটি কম পঠনযোগ্য বলে মনে করে তা বুঝতে পারি না। এটা ঠিক দুর্দান্ত!
কার্ল অ্যাডলার

9
ব্যবহার Array#someসত্যিই দুর্দান্ত। প্রথমত এটি 99 এবং ফায়ারফক্স 1.5 সহ বেশিরভাগ ব্রাউজারের সাথে সামঞ্জস্যপূর্ণ সত্যিই খুব ভাল কাজ করে। আমার উদাহরণ ব্যবহারের কেসটি [a, b] রেঞ্জের একটি অ্যারেতে সূচকটি সন্ধান করা হবে যেখানে একটি সংখ্যা একটি নিম্ন সীমানা এবং উপরের সীমানা জুটির মধ্যে থাকে, পরীক্ষা করে পাওয়া যায় এবং সত্য পাওয়া যায়। for..ofকেবলমাত্র নতুন ব্রাউজারগুলির জন্যই পরবর্তী সেরা সমাধান হবে।
সোজিম্যাক্সি

95
ব্যতিক্রম হ্যান্ডলিং নিয়ন্ত্রণ প্রবাহ হিসাবে কখনও ব্যবহার করা উচিত। সময়কাল।
স্পষ্টভাবে

479

লুপের জন্য নতুন ব্যবহার করে ECMAScript2015 (ওরফে ES6) এ করার আরও একটি ভাল উপায় আছে । উদাহরণস্বরূপ, এই কোডটি 5 নম্বর পরে অ্যারে উপাদানগুলি মুদ্রণ করে না:

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for (let el of arr) {
  console.log(el);
  if (el === 5) {
    break;
  }
}

ডক্স থেকে:

উভয়ই ... পক্ষে এবং ... বিবৃতিতে কোনও কিছুর উপরে পুনরাবৃত্তি হয়। তাদের মধ্যে প্রধান পার্থক্য হল তারা পুনরাবৃত্তি করে। জন্য ... মধ্যে বিবৃতি একটি বস্তুর গণনীয় বৈশিষ্ট্য, মূল সন্নিবেশ অনুক্রমে উপর iterates। জন্য ... এর বিবৃতি ডেটার উপর iterates iterable বস্তুর সংজ্ঞায়িত উপর iterated করা হয়।

পুনরাবৃত্তির সূচক দরকার? আপনি ব্যবহার করতে পারেন Array.entries():

for (const [index, el] of arr.entries()) {
  if ( index === 5 ) break;
}

4
@ সুপেরেরো আপনি একটি লুপের জন্য উপাদানটির সূচক পেতে পারেন, আপনাকে কেবল ব্যবহার করতে হবে entries। কিছু অ্যারে.এন্ট্রি (()) এর (কনস্ট [সূচক, উপাদান]) এর জন্য ... // ...}
ব্ল্যাকএক্সার্ড

অ্যারে ব্যবহার করে ... না ব্যবহার করার পরামর্শ দেওয়া হচ্ছে না?
স্কিচটা

4
@emostafa আপনি সম্পর্কে সঠিক মধ্যে লুপ অ্যারে জন্য সুপারিশ করা হচ্ছে, কিন্তু এই আসলে পন্থা জন্য ব্যবহার এর লুপ।
ক্যানাক

এটি "ফর অফ", এবং এটি সত্যিই একটি পরিষ্কার সমাধান ... তবে এটি একটি ES6 বৈশিষ্ট্য, তাই কেবল সচেতন থাকুন যে আপনার পরিবেশ ES6 এর জন্য সেটআপ করা থাকলে এটি কেবলমাত্র কাজ করবে।
চাদ

আমি নিজেকে এই সমাধানটি অনেকগুলি ব্যবহার করে দেখতে পাই এবং আমি এটি বস্তুর জন্যও ব্যবহার করি। বস্তুগুলির সাহায্যে আপনি এটি করতে পারেন Object.entries(myObject)এবং তারপরে for..inঅ্যারের জন্য যেমন ব্যবহার করেন ঠিক তেমন এটি ব্যবহার করতে পারেন । নোট করুন যে জেএস অ্যারেগুলি মূলত হুডের অধীনে অবজেক্টস: blog.niftysnippets.org/2011/01/myth-of-arrays.html
অ্যান্ড্রু

204

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

[1,2,3].every(function(el) {
    return !(el === 1);
});

ES6

[1,2,3].every( el => el !== 1 )

পুরানো ব্রাউজার সমর্থন ব্যবহারের জন্য:

if (!Array.prototype.every)
{
  Array.prototype.every = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this &&
          !fun.call(thisp, this[i], i, this))
        return false;
    }

    return true;
  };
}

আরও বিশদ এখানে


10
ES6 এ এখন সুন্দর এবং পরিষ্কার[1,2,3].every( el => el !== 1 )
5

1
@ ভালডেমার, তবে কি every গ্যারান্টি দেয় যে কলগুলি ক্রমানুসারে করা হয়?
পেসারিয়ার

4
@ পেসারিয়ার, আপনি ES6 স্পেসিফিকেশনে অ্যালগরিদম দেখতে পারেন যা সূচক k0 থেকে শুরু হয় এবং 1: http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.every
এক্সপি 1

@ এক্সপি 1, সমস্ত প্রয়োগকারীদের কি সেভাবে করা দরকার?
পেসারিয়ার

1
@ পেসারিয়র, হ্যাঁ, সর্বাধিক জনপ্রিয় বাস্তবায়নগুলি সঠিকভাবে কাজ করে। আপনি যদি এম্বেড থাকা বাস্তবায়ন সম্পর্কে উদ্বিগ্ন হন তবে সাধারণত এটি অপেরা বা ওয়েবকিট। অ্যারে উপস্থিত প্রতিটি উপাদানগুলির জন্য প্রতিটি কল কলব্যাকফএন পদ্ধতি, আরোহী ক্রমে , যতক্ষণ না এটি কলব্যাকফ্যান মিথ্যা প্রত্যাবর্তন করে এমন এক সন্ধান করে। এছাড়াও ধাপ 7. তাকান ট 0. এবং 8.e বৃদ্ধি ট হতে দ্বারা 1.
Valdemar_Rudolfovich

78

এর MDN ডকুমেন্টেশনArray.prototype.forEach() থেকে উদ্ধৃতি :

নেই বন্ধ করতে বা বিরতি কোন উপায় একটি forEach()ব্যতিক্রম ছুঁড়ে ছাড়া অন্য লুপ। আপনার যদি এমন আচরণের প্রয়োজন .forEach()হয় তবে পদ্ধতিটি ভুল সরঞ্জাম , পরিবর্তে একটি সরল লুপ ব্যবহার করুন। আপনি যদি প্রিকেটটির জন্য অ্যারে উপাদানগুলি পরীক্ষা করে থাকেন এবং বুলিয়ান রিটার্ন মান প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন every()বা some()তার পরিবর্তে।

আপনার কোডের জন্য (প্রশ্নে) @ বিবিসের পরামর্শ অনুসারে Array.prototype.some()পরিবর্তে ব্যবহার করুন। এটি আপনার ইউজকেসের সাথে খুব ভাল স্যুট করে।

Array.prototype.some()অ্যারে উপস্থিত প্রতিটি উপাদানগুলির জন্য একবার কলব্যাক ফাংশন কার্যকর করে যতক্ষণ না এটি সন্ধান করে যেখানে কলব্যাক সত্যবাদী মান (একটিতে রূপান্তরিত হওয়ার পরে সত্য হয়ে যায় Boolean)) যদি এই জাতীয় উপাদান পাওয়া যায় তবে some()অবিলম্বে সত্য ফিরে আসে। অন্যথায়, some()মিথ্যা প্রত্যাবর্তন। কলব্যাক কেবল অ্যারের সূচকগুলির জন্য অনুরোধ করা হয়েছে যা মানগুলি নির্ধারিত করেছে; এটি মুছে ফেলা হয়েছে বা যা কখনও মান নির্ধারিত হয় নি এমন সূচিগুলির জন্য অনুরোধ করা হয়নি।


1
এটা সঠিক উত্তর. 'কিছু' ঠিক কীভাবে ভবিষ্যদ্বাণী / বিরতি করবে does এটি পুনরাবৃত্তি n = সত্য পর্যন্ত অবধি লুপ করে।
অ্যান্টনি বুথ

74

দুর্ভাগ্যক্রমে এই ক্ষেত্রে আপনি ব্যবহার না করলে এটি আরও ভাল হবে forEach। পরিবর্তে একটি নিয়মিত forলুপ ব্যবহার করুন এবং এটি এখন আপনার প্রত্যাশা মতো ঠিক কাজ করবে।

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

27
এটি আমাকে স্তম্ভিত করে যে উচ্চতর পারফরম্যান্স, কম কোড এবং এই সঠিক উত্তরের আরও ভাল পঠনযোগ্যতার তুলনায় সর্বাধিক ভোটই সম্ভব সবচেয়ে খারাপ বাস্তবায়ন। ব্যতিক্রম নিক্ষেপ ... সত্যি? লুপের জন্য theতিহ্যবাহী কি কেবল চটজলদি নয়?
gdbj

2
@ জিডিবিজে আমি আপনার বক্তব্যের সাথে একমত হয়েছি এবং এই পদ্ধতিটি ব্যবহার করেছি, তবে যা সত্যই আমাকে ধাক্কা দেয় তা হ্যাক ছাড়া এইচকে ছাড়ার কোনও উপায় নেই, এখন এটি খারাপ নকশা।
স্কটএন

28

jqueryএর eachপদ্ধতিটি ব্যবহার করতে বিবেচনা করুন , যেহেতু এটি কলব্যাক ফাংশনটির ভিতরে মিথ্যা ফিরিয়ে দিতে দেয়:

$.each(function(e, i) { 
   if (i % 2) return false;
   console.log(e)
})

লোডাশ লাইব্রেরিগুলি এমন takeWhileপদ্ধতিও সরবরাহ করে যা মানচিত্র / হ্রাস / ভাঁজ ইত্যাদির সাথে জড়িত হতে পারে:

var users = [
  { 'user': 'barney',  'active': false },
  { 'user': 'fred',    'active': false },
  { 'user': 'pebbles', 'active': true }
];

_.takeWhile(users, function(o) { return !o.active; });
// => objects for ['barney', 'fred']

// The `_.matches` iteratee shorthand.
_.takeWhile(users, { 'user': 'barney', 'active': false });
// => objects for ['barney']

// The `_.matchesProperty` iteratee shorthand.
_.takeWhile(users, ['active', false]);
// => objects for ['barney', 'fred']

// The `_.property` iteratee shorthand.
_.takeWhile(users, 'active');
// => []

1
JQuery ব্যবহার করার ভাল কারণ। নেটিভ জাভাস্ক্রিপ্টে প্রত্যেকটির জন্য এখনও অভাব রয়েছে।
অ্যালেক্স গ্র্যান্ডে

3
অ্যালেক্সগ্র্যান্ড jQuery এর forEach এবং জাভাস্ক্রিপ্ট এর forEach সামঞ্জস্যপূর্ণ নয়।
বেজর্ন

10
জাভাস্ক্রিপ্ট অনেক জায়গায় ব্যবহার করা হয় যে jQuery কোনও বিকল্প নয়।
জেবিআরউইলকিনসন


18

আপনি যদি ডিন এডওয়ার্ডের পরামর্শটি ব্যবহার করতে চান এবং ত্রুটিটি না ধরেই লুপ থেকে বেরিয়ে যাওয়ার জন্য স্টিপইটারেশন ত্রুটি নিক্ষেপ করতে চান তবে আপনি নীচের ফাংশনটি ( মূলত এখান থেকে ) ব্যবহার করতে পারেন :

// Use a closure to prevent the global namespace from be polluted.
(function() {
  // Define StopIteration as part of the global scope if it
  // isn't already defined.
  if(typeof StopIteration == "undefined") {
    StopIteration = new Error("StopIteration");
  }

  // The original version of Array.prototype.forEach.
  var oldForEach = Array.prototype.forEach;

  // If forEach actually exists, define forEach so you can
  // break out of it by throwing StopIteration.  Allow
  // other errors will be thrown as normal.
  if(oldForEach) {
    Array.prototype.forEach = function() {
      try {
        oldForEach.apply(this, [].slice.call(arguments, 0));
      }
      catch(e) {
        if(e !== StopIteration) {
          throw e;
        }
      }
    };
  }
})();

উপরের কোডটি আপনাকে নিজের চেষ্টা-সংক্রান্ত ধারাগুলি না করে নিচের মতো কোড চালানোর ক্ষমতা দেয়:

// Show the contents until you get to "2".
[0,1,2,3,4].forEach(function(val) {
  if(val == 2)
    throw StopIteration;
  alert(val);
});

একটি গুরুত্বপূর্ণ জিনিস মনে রাখবেন তা হ'ল এটি কেবলমাত্র অ্যারে.প্রোটোটাইপ.ফোর প্রতিটি ফাংশনটি ইতিমধ্যে বিদ্যমান থাকলে আপডেট করবে। যদি এটি ইতিমধ্যে বিদ্যমান না থাকে তবে এটি এটিকে পরিবর্তন করবে না।


11

সংক্ষিপ্ত উত্তর: এর জন্য for...breakব্যবহার করুন বা ভঙ্গ এড়াতে আপনার কোড পরিবর্তন করুন forEach। ব্যবহার .some()বা .every()অনুকরণ করবেন না for...breakfor...breakলুপ বা ব্যবহার এড়াতে আপনার কোডটি পুনরায় লিখুন for...break। আপনি যখনই এই পদ্ধতিগুলি for...breakবিকল্প হিসাবে ব্যবহার করেন তখন Godশ্বর বিড়ালছানাটিকে হত্যা করে।

দীর্ঘ উত্তর:

.some()এবং .every()উভয় রিটার্ন booleanমান, .some()আয় trueযদি যার জন্য কোনো উপাদান ফাংশন আয় পাস true, যে আয় falseযদি ফাংশন আয় পাস, যার জন্য কোনো উপাদান false। এই যে ফাংশন মানে। তারা যা বোঝায় না তার জন্য ফাংশনগুলি ব্যবহার করা আরও CSS এর পরিবর্তে বিন্যাসের জন্য টেবিলগুলি ব্যবহার করা আরও খারাপ কারণ এটি আপনার কোডটি পড়া প্রত্যেককে হতাশ করে।

এছাড়াও, for...breakবিকল্প হিসাবে এই পদ্ধতিগুলি ব্যবহারের একমাত্র সম্ভাব্য উপায় হচ্ছে পার্শ্ব-প্রতিক্রিয়া তৈরি করা ( .some()কলব্যাক ফাংশনের বাইরে কিছু ভার পরিবর্তন করা ), এবং এটি এর থেকে খুব বেশি আলাদা নয় for...break

সুতরাং, লুপ বিকল্প ব্যবহার .some()বা .every()হিসাবে for...breakপার্শ্ব প্রতিক্রিয়া মুক্ত নয়, এটি তখন খুব পরিষ্কার নয় for...break, এটি হতাশার, তাই এটি আরও ভাল নয়।

আপনি সর্বদা আপনার কোডটি পুনরায় লিখতে পারেন যাতে কোনও প্রয়োজন না হয় for...break। আপনি অ্যারে ব্যবহার করে ফিল্টার .filter()করতে পারবেন, আপনি আরও ব্যবহার করে অ্যারে বিভক্ত করতে পারেন .slice(), তারপরে .forEach()বা .map()অ্যারের অংশটি ব্যবহার করুন ।


। ফিল্টার ব্যবহার করা আসলে ব্রেকিংয়ের জন্য প্রচুর ব্যবহারের ক্ষেত্রে উপযুক্ত সমাধান।
TKoL

অভিনয় সম্পর্কে কি? ঘন ঘন ব্যবহার করা হলে ওয়াউডল ফিল্টারগুলি কর্মক্ষমতাকে প্রভাবিত করে না?
tfrascaroli

হ্যাঁ, ফিল্টার অ্যারে প্রোটোটাইপ ভারী হতে পারে। আমি এটি পছন্দ করি তবে এটি যদি অতিরিক্ত ব্যবহার না করে তবে এটি কার্য সম্পাদন করতে পারে।
চাদ

@ffscaroli for...breakআপনার পারফরম্যান্সের প্রয়োজন হলে লুপটি ব্যবহার করুন । forলুপ চেয়ে সবচেয়ে performant পুনরাবৃত্তির টুল .forEach(), .any(), .map(), .filter()ইত্যাদি
ম্যাক্স

6

সমস্যাটি সমাধান করার জন্য এটিই আমি এনেছি ... আমি নিশ্চিত যে এটি আসল প্রশ্নকারীকে যে সমস্যাটি করেছে তা ঠিক করে দিয়েছে:

Array.prototype.each = function(callback){
    if(!callback) return false;
    for(var i=0; i<this.length; i++){
        if(callback(this[i], i) == false) break;
    }
};

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

var myarray = [1,2,3];
myarray.each(function(item, index){
    // do something with the item
    // if(item != somecondition) return false; 
});

কলব্যাক ফাংশনের ভিতরে মিথ্যা ফিরিয়ে দেওয়া বিরতির কারণ হবে। এটি যদি কাজ করে না তবে আমাকে জানান।


1
=== falseএর চেয়ে ভাল হতে পারে == falseসুতরাং লুপটি চালিয়ে যাওয়ার জন্য আপনাকে স্পষ্টভাবে সত্য (বা সত্যবাদী মান) দিতে হবে না, যাতে কিছু নিয়ন্ত্রণ পথ কোনও মান ফেরত না দেয় এবং লুপটি অপ্রত্যাশিতভাবে ভেঙে যায়।
জ্যাক

6

আমি আর একটি ধারণা নিয়ে এসেছি:

function forEach(array, cb) {
  var shouldBreak;
  function _break() { shouldBreak = true; }
  for (var i = 0, bound = array.length; i < bound; ++i) {
    if (shouldBreak) { break; }
    cb(array[i], i, array, _break);
  }
}

// Usage

forEach(['a','b','c','d','e','f'], function (char, i, array, _break) {
  console.log(i, char);
  if (i === 2) { _break(); }
});


সিনট্যাক্সটি [এনএসআরাই এনুমারেটঅবজেক্টস ইউজিংব্লক] এর অনুরূপ, ধন্যবাদ!
Chrstph এসএলএন

@ ড্রেনাই স্বাক্ষরটি স্থানীয়ভাবে সাদৃশ্যপূর্ণ Array.prototype.forEach()forএবং breakএই প্রশ্ন জিজ্ঞাসা করার অনেক আগে থেকেই ছিল; ওপি আরও বেশি কার্যকর, ব্যবহার করে সেই আচরণটির সন্ধান করছিল forEach
c24w

@ ড্রেনাই এখন তাদের মন্তব্য মুছে ফেলেছে (তবে ডাউনটোটটি ছেড়ে গেছে) যা উল্লেখ করেছে যে যখন আপনি for...inএবং এর সাথে সমস্যার সমাধান করতে পারেন তখন এই সমাধানটির স্বাক্ষর মনে রাখা শক্ত এবং অপ্রয়োজনীয় break
সি 24 ডাব্লু

5

এই সমাধানটি অন্য সাইটে পাওয়া গেছে। আপনি চেষ্টা / ধরনের দৃশ্যে ফরইচকে মোড়ানো করতে পারেন।

if(typeof StopIteration == "undefined") {
 StopIteration = new Error("StopIteration");
}

try {
  [1,2,3].forEach(function(el){
    alert(el);
    if(el === 1) throw StopIteration;
  });
} catch(error) { if(error != StopIteration) throw error; }

আরও বিশদ এখানে: http://dean.edwards.name/weblog/2006/07/enum/


2
নিয়ন্ত্রণ প্রবাহের বিবৃতি হিসাবে ব্যতিক্রমগুলি ব্যবহার করবেন না। অপ্রত্যাশিত ফলাফলগুলি পরিচালনা করার জন্য এটি ব্যবহার করুন।
সর্বোচ্চ


4

যদি আপনাকে পুনরাবৃত্তির পরে আপনার অ্যারে অ্যাক্সেস করার প্রয়োজন না হয় তবে অ্যারের দৈর্ঘ্য 0 এ সেট করে আপনি জামিন দিতে পারবেন your

[1,3,4,5,6,7,8,244,3,5,2].forEach(function (item, index, arr) {
  if (index === 3) arr.length = 0;
});

বা ক্লোন সহ:

var x = [1,3,4,5,6,7,8,244,3,5,2];

x.slice().forEach(function (item, index, arr) {
  if (index === 3) arr.length = 0;
});

যা আপনার কোডে এলোমেলো ত্রুটি ছুঁড়ে দেওয়া এর থেকেও ভাল সমাধান।


ভাল কাজ করেছেন :) কিন্তু যদি বরাদ্দ পর কিছু ক্রিয়ার আছে array.lengthকরার 0, তারা বর্তমান পুনরাবৃত্তির প্রযোজ্য হবে যাতে সম্ভবত এটি কখনও কখনও ভাল ব্যবহার করবেন তা returnপরে যেমন বরাদ্দ
zhibirc

4

এটি লুপের জন্য, তবে লুপে অবজেক্টের রেফারেন্স ঠিক একটি ফর (প্রতিটি) জন্য রাখে তবে আপনি বেরিয়ে যেতে পারেন break

var arr = [1,2,3];
for (var i = 0, el; el = arr[i]; i++) {
    if(el === 1) break;
}

4

পূর্বে উল্লিখিত হিসাবে, আপনি বিরতি করতে পারবেন না .forEach()

ES6 Iterators এর সাথে ফোরচ করার কিছুটা আধুনিক উপায়। পুনরাবৃত্তি যখন index/ আপনি সরাসরি অ্যাক্সেস পেতে অনুমতি দেয় value

const array = ['one', 'two', 'three'];

for (const [index, val] of array.entries()) {
  console.log('item:', { index, val });
  if (index === 1) {
    console.log('break!');
    break;
  }
}

আউটপুট:

item: { index: 0, val: 'one' }
item: { index: 1, val: 'two' }
break!

লিংক


3

তবুও আরেকটি পন্থা

        var wageType = types.filter(function(element){
            if(e.params.data.text == element.name){ 
                return element;
            }
        });
        console.dir(wageType);

2

আমি সেই উদ্দেশ্যে নালহ্যাক ব্যবহার করি, এটি এর সম্পত্তি অ্যাক্সেস করার চেষ্টা করে null, যা একটি ত্রুটি:

try {
  [1,2,3,4,5]
  .forEach(
    function ( val, idx, arr ) {
      if ( val == 3 ) null.NULLBREAK;
    }
  );
} catch (e) {
  // e <=> TypeError: null has no properties
}
//

1
শুধু কেন নয় throw BREAK?
বার্গি

1

আপনি যদি নিজের forEachসিনট্যাক্সটি রাখতে চান তবে এটি দক্ষ রাখার একটি উপায় (যদিও লুপের জন্য নিয়মিত হিসাবে ভাল নয়)। কোনও ভেরিয়েবলের জন্য অবিলম্বে চেক করুন যা জানে যে আপনি লুপটি ভেঙে ফেলতে চান কিনা want

এই উদাহরণটিতে একটি তৈরি করার জন্য একটি বেনামী ফাংশন ব্যবহার ফাংশন সুযোগ প্রায় forEachযা আপনি সংরক্ষণ করতে প্রয়োজন সম্পন্ন তথ্য।

(function(){
    var element = document.getElementById('printed-result');
    var done = false;
    [1,2,3,4].forEach(function(item){
        if(done){ return; }
        var text = document.createTextNode(item);
        element.appendChild(text);
        if (item === 2){
          done = true;
          return;
        }
    });
})();
<div id="printed-result"></div>

আমার দুই সেন্ট.




0

@ ববিন্সের সাথে সম্মত হন, উত্সাহিত।

এছাড়াও, এফওয়াইআই:

প্রোটোটাইপ.জেএস এর এই উদ্দেশ্যে কিছু রয়েছে:

<script type="text/javascript">
  $$('a').each(function(el, idx) {
    if ( /* break condition */ ) throw $break;
    // do something
  });
</script>

$break অভ্যন্তরীণভাবে প্রোটোটাইপ.জেএস দ্বারা ধরা এবং পরিচালনা করা হবে, "প্রতিটি" চক্রটি ভেঙে তবে বাহ্যিক ত্রুটি তৈরি করবে না।

বিস্তারিত জানতে প্রোটোটাইপ.জেএস এপিআই দেখুন ।

jQuery এরও একটি উপায় রয়েছে, লুপটি তাড়াতাড়ি ভাঙতে কেবল হ্যান্ডলারে মিথ্যা ফিরিয়ে দিন:

<script type="text/javascript">
  jQuery('a').each( function(idx) {
    if ( /* break condition */ ) return false;
    // do something

  });
</script>

বিশদগুলির জন্য jQuery API দেখুন ।


0

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

let keepGoing = true;
things.forEach( (thing) => {
  if (noMore) keepGoing = false;
  if (keepGoing) {
     // do things with thing
  }
});

continueএকটি কীওয়ার্ড, আপনার কোডটি একটি সিনট্যাক্স ত্রুটি।
বার্গি

3
আপনি যেভাবেই ES6 ব্যবহার করছেন তা প্রদত্ত, আপনার কেবল একটি for ofলুপে চলে যেতে হবে এবং break;এটিকে যথারীতি থেকে নেওয়া উচিত ।
বার্গি

স্থির, এবং সত্য - তবে বেশিরভাগ বংশবৃদ্ধির জন্য এস 6 ব্যবহার করছিলেন
শহীদ 21

0

আপনি নীচের কোডটি অনুসরণ করতে পারেন যা আমার পক্ষে কাজ করে:

 var     loopStop = false;
YOUR_ARRAY.forEach(function loop(){
    if(loopStop){ return; }
    if(condition){ loopStop = true; }
});

কেন -1? এটি একটি ব্যতিক্রম ধরা চেয়ে কুশলী নয়, এটি একটি বড় হ্যাক IMHO।
বায়রন

0

আমি ব্যবহার করতে পছন্দ করি for in

var words = ['a', 'b', 'c'];
var text = '';
for (x in words) {
    if (words[x] == 'b') continue;
    text += words[x];
}
console.log(text);

for inঅনেকটা কাজ করে forEachএবং আপনি অভ্যন্তরে প্রস্থান করতে ফিরতে যোগ করতে পারেন। আরও ভাল পারফরম্যান্স।


0

আপনার ক্ষেত্রে যেমন ইতিমধ্যে আপনার অ্যারেতে থাকা উপাদানগুলির মানের উপর ভিত্তি করে আপনার ভাঙার প্রয়োজন হয় (যেমন ব্রেকের শর্তটি রান-টাইম ভেরিয়েবলের উপর নির্ভর করে না যা অ্যারের উপাদানগুলির মান নির্ধারিত হওয়ার পরে পরিবর্তিত হতে পারে) আপনি সংমিশ্রণটিও ব্যবহার করতে পারেন নীচে স্লাইস () এবং সূচিপত্র () এর

যদি প্রতিটি 'অ্যাপল' এ পৌঁছায় আপনার ভাঙার দরকার হয় তবে আপনি ব্যবহার করতে পারেন

var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var fruitsToLoop = fruits.slice(0, fruits.indexOf("Apple"));
// fruitsToLoop = Banana,Orange,Lemon

fruitsToLoop.forEach(function(el) {
    // no need to break
});

W3Schools.com তে বর্ণিত হিসাবে স্লাইস () পদ্ধতিটি একটি নতুন অ্যারে অবজেক্ট হিসাবে নির্বাচিত উপাদানগুলিকে একটি অ্যারেতে ফেরত দেয়। মূল অ্যারে পরিবর্তন করা হবে না।

এটি জেএসফিডেলে দেখুন

আশা করি এটি কাউকে সাহায্য করবে।


0

আপনার একটি বৈকল্পিক তৈরি করতে পারেন forEachযে জন্য করতে পারবেন break, continue, return, এবং এমনকি async/ await: (উদাহরণস্বরূপ টাইপ করা বিষয় লেখা)

export type LoopControlOp = "break" | "continue" | ["return", any];
export type LoopFunc<T> = (value: T, index: number, array: T[])=>LoopControlOp;

Array.prototype.ForEach = function ForEach<T>(this: T[], func: LoopFunc<T>) {
    for (let i = 0; i < this.length; i++) {
        const controlOp = func(this[i], i, this);
        if (controlOp == "break") break;
        if (controlOp == "continue") continue;
        if (controlOp instanceof Array) return controlOp[1];
    }
};

// this variant lets you use async/await in the loop-func, with the loop "awaiting" for each entry
Array.prototype.ForEachAsync = async function ForEachAsync<T>(this: T[], func: LoopFunc<T>) {
    for (let i = 0; i < this.length; i++) {
        const controlOp = await func(this[i], i, this);
        if (controlOp == "break") break;
        if (controlOp == "continue") continue;
        if (controlOp instanceof Array) return controlOp[1];
    }
};

ব্যবহার:

function GetCoffee() {
    const cancelReason = peopleOnStreet.ForEach((person, index)=> {
        if (index == 0) return "continue";
        if (person.type == "friend") return "break";
        if (person.type == "boss") return ["return", "nevermind"];
    });
    if (cancelReason) console.log("Coffee canceled because: " + cancelReason);
}

-1

"সন্ধান করুন" দিয়ে চেষ্টা করুন:

var myCategories = [
 {category: "start", name: "Start", color: "#AC193D"},
 {category: "action", name: "Action", color: "#8C0095"},
 {category: "exit", name: "Exit", color: "#008A00"}
];

function findCategory(category) {
  return myCategories.find(function(element) {
    return element.category === category;
  });
}

console.log(findCategory("start"));
// output: { category: "start", name: "Start", color: "#AC193D" }

-1

হ্যাঁ এটি চালিয়ে যাওয়া এবং একটি ফর লুপের প্রস্থান সম্ভব।

অবিরত রাখতে আপনি রিটার্নটি ব্যবহার করতে পারবেন, লুপটি চলতে থাকবে তবে বর্তমান ফাংশনটি শেষ হবে।

লুপ থেকে প্রস্থান করতে, আপনি তৃতীয় প্যারামিটার 0 দৈর্ঘ্যে সেট করতে পারেন, খালি অ্যারেতে সেট করুন to লুপটি চলবে না, বর্তমান ফাংশনটি করে, তাই আপনি শেষ করতে "রিটার্ন" ব্যবহার করতে পারেন, যেমন লুপের জন্য কোনও সাধারণভাবে প্রস্থান করার জন্য ...

এই:

[1,2,3,4,5,6,7,8,9,10].forEach((a,b,c) => {
    console.log(a);
    if(b == 2){return;}
    if(b == 4){c.length = 0;return;}
    console.log("next...",b);
});

এটি মুদ্রণ করবে:

1
next... 0
2
next... 1
3
4
next... 3
5

-2

এর আগে, আমার কোডটি নীচে

 this.state.itemsDataSource.forEach((item: any) => {
                if (!item.isByPass && (item.invoiceDate == null || item.invoiceNumber == 0)) {

                    return false;
                }
            });

আমি নীচে পরিবর্তিত হয়েছে, এটি স্থির ছিল।

 for (var i = 0; i < this.state.itemsDataSource.length; i++) {
                var item = this.state.itemsDataSource[i];
                if (!item.isByPass && (item.invoiceDate == null || item.invoiceNumber == 0)) {

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