আন্ডারস্কোর.জেএস-এ কীভাবে ভাঙতে হবে break


200

আমি আন্ডারস্কোর.জেএস _.each()পদ্ধতির পুনরাবৃত্তি বন্ধ করার একটি উপায় খুঁজছি , তবে সমাধানটি খুঁজে পাচ্ছি না। jQuery .each()আপনি যদি না ভাঙ্গতে পারে return false

প্রতিটি () কে আন্ডারস্কোর বন্ধ করার কোনও উপায় আছে কি?

_([1,2,3]).each(function(v){
    if (v==2) return /*what?*/;
})

4
এটি সম্ভব বলে আমি মনে করি না, কারণ স্থানীয় forEachফাংশনটিও এই বৈশিষ্ট্যটি সরবরাহ করে না।
ফেলিক্স ক্লিং

8
সাধারণত eachকোনও ক্লোজার (বেশিরভাগ ভাষায়) ব্যবহার করার সময় আপনি প্রথমে আপনার তালিকাটি ফিল্টার করতে চান। এইভাবে আপনার এটি থেকে বিরতি নিয়ে চিন্তা করতে হবে না। সাধারণভাবে বলতে গেলে, যদি আপনার পুনরুক্তি থেকে খুব তাড়াতাড়ি বিরতি দরকার হয় তবে সম্ভবত এটির অন্যরকম উপায় রয়েছে you
রব হুড়স্কা

গ্রোভির জন্য এখানে কয়েকটি সম্পর্কিত প্রশ্ন রয়েছে, যেখানে আচরণ (সুবিধাজনকভাবে একটি eachবন্ধ হওয়া থেকে ভাঙ্গতে অক্ষমতা ) জাভাস্ক্রিপ্টের মতো।
রব হুশকা

@ দিমিত্রি_এফ, যেমন অন্যেরা উল্লেখ করেছেন, আপনি যা বলছেন ঠিক তেমন করতে পারবেন না। তবে আমি যেমনটি দেখিয়েছি, আপনি Array.everyনিজের পছন্দমতো আচরণ অনুকরণ করতে ব্যবহার করতে পারেন।
aeskr

@Rob। চিয়ার্স। প্রথম মন্তব্য সত্যিই সহায়ক। সত্যিই আমি এটি করতে পারি অন্যরকম উপায় ছিল।
নেট.uk.sweet

উত্তর:


267

আপনি eachপদ্ধতিটি ভেঙে ফেলতে পারবেন না — এটি দেশীয় forEachপদ্ধতির আচরণ অনুকরণ করে এবং নেটিভ forEachলুপটি এড়ানোর জন্য সরবরাহ করে না (ব্যতিক্রম ছোঁড়া ছাড়া অন্যটি)।

তবে সব আশা হারিয়ে যায় না! আপনি Array.everyপদ্ধতিটি ব্যবহার করতে পারেন । :)

সেই লিঙ্ক থেকে:

everycallbackঅ্যারে উপস্থিত প্রতিটি উপাদানগুলির জন্য প্রদত্ত ফাংশনটি একবার সম্পাদন করে যতক্ষণ না এটি খুঁজে পায় যেখানে callbackকোনও মিথ্যা মান প্রদান করে। যদি এই জাতীয় উপাদান পাওয়া যায় তবে everyপদ্ধতিটি সঙ্গে সঙ্গে মিথ্যা ফিরিয়ে দেয় returns

অন্য কথায়, আপনি এইরকম সংশ্লেষিত কিছু করতে পারেন ( জেএসফিডেলের লিঙ্ক ):

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

এটি এর 1মাধ্যমে সতর্ক করবে 3এবং তারপরে লুপ থেকে "ব্রেক" করবে "

আপনি underscore.js ব্যবহার করছেন, যাতে আপনি জানতে এটা যে সন্তুষ্ট হবেন না একটি প্রদান everyপদ্ধতি-তারা একে ডাকতে every, কিন্তু যে লিঙ্ক উল্লেখ, তারা উপনাম নামক প্রদান all


2
আন্ডারস্কোর.জেএসও কি এর জন্য একটি বাস্তবায়ন সরবরাহ করে?
ফেলিক্স ক্লিং

1
@ ফেলিক্সক্লিং, হ্যাঁ তা করে। আমি আমার উত্তরে এটি যোগ করেছি।
aeskr

2
এই মুহূর্তে (05/2013), আন্ডারস্কোরে অ্যারেগুলির জন্য একটিও নেই _.every()এবং নাও কোনও _.all()পদ্ধতি রয়েছে - সুতরাং এটি আটকে দিন Array.every()
পিকেইক

3
এটি কাজ করবে তবে এটি ব্যবহারের স্বাভাবিক কারণ every। সুতরাং পাঠযোগ্যতার জন্য সতর্কতা অবলম্বন করুন।
evanrmurphy

3
এর জন্য আন্ডারস্কোর ডক্সটিতে _.each()বিশেষত একটি নোট রয়েছে যে আপনি লুপটি ভেঙে ফেলতে পারবেন না এবং _.find()পরিবর্তে এটি ব্যবহার করার পরামর্শ দিন। http://underscorejs.org/#each
ব্লাট

70

হালনাগাদ:

_ উপাদানটি পাওয়া গেলে লুপটি ভেঙে ফাইন্ডটি ভাল হবে:

var searchArr = [{id:1,text:"foo"},{id:2,text:"bar"}];
var count = 0;
var filteredEl = _.find(searchArr,function(arrEl){ 
              count = count +1;
              if(arrEl.id === 1 ){
                  return arrEl;
              }
            });

console.log(filteredEl);
//since we are searching the first element in the array, the count will be one
console.log(count);
//output: filteredEl : {id:1,text:"foo"} , count: 1

** পুরাতন **

আপনি যদি শর্তাধীন কোনও লুপটি ভাঙতে চান তবে _.ইচের পরিবর্তে _.ফিল্টার এপি ব্যবহার করুন। এখানে একটি কোড স্নিপেট

var searchArr = [{id:1,text:"foo"},{id:2,text:"bar"}];
var filteredEl = _.filter(searchArr,function(arrEl){ 
                  if(arrEl.id === 1 ){
                      return arrEl;
                  }
                });
console.log(filteredEl);
//output: {id:1,text:"foo"}

1
এটি লুপটি ভাঙবে না - এটি কেবল অ্যারে ফিল্টার করে। ভাবুন আপনার অ্যারেতে 2 নয়, 20.000 আইটেম রয়েছে। আপনি লগ করলে কেবল পোস্ট করা উদাহরণটিই আউটপুট করতে পারে তবে লুপটি 20.000 বার চলবে :(
পিকেইক

@ পিকেইক আপনি ঠিকই বলেছেন, এটি হতে পারে _এফটি ফিল্ডারের চেয়ে ভাল, এটি এলিমেণ্টের সন্ধানের পরে ভাঙার সাথে সাথে এখানে ফিজল
নিখিল

2
আমি মনে করি এই উত্তরটি সঠিক হিসাবে চিহ্নিত করা উচিত। _.findজিজ্ঞাসা করা ঠিক কি করে: কলব্যাক ফিরে না আসা পর্যন্ত তালিকার উপরে পুনরাবৃত্তি true
ফাবিয়েন কোয়াটারভাক্স

এই উত্তরের জন্য ভোট দিয়েছেন কারণ স্বীকৃত উত্তর (অ্যারে.এভরি) অবজেক্টগুলিতে কাজ করবে না, তবে _.ফাইন্ড () করবে।
ম্যাট

এবং ডকসগুলিতে এটিই পুনরায় স্মরণযোগ্য: এটি লক্ষ্য করাও ভাল যে প্রতিটি লুপ ভাঙা যায় না - ভাঙ্গতে, পরিবর্তে _.ফাইন্ড ব্যবহার করুন।
শাহারসোল

15

_.someপরিবর্তে আপনি দেখতে পারেন _.each_.someকোনও ভবিষ্যদ্বাণীটি সত্য হয়ে গেলে তালিকায় স্থান পরিবর্তন বন্ধ করে দেয়। ফলাফল (গুলি) একটি বাহ্যিক ভেরিয়েবলে সংরক্ষণ করা যেতে পারে।

_.some([1, 2, 3], function(v) {
    if (v == 2) return true;
})

দেখুন http://outscorejs.org/#some



3

হতে পারে আপনি অ্যান্ডস্কোরের () বা () খুঁজে পেতে চান যা কোনও শর্ত পূরণ হওয়ার পরে প্রক্রিয়াজাতকরণ বন্ধ করে দেয়।



3

আপনি forEachআন্ডারস্কোর এ ভাঙ্গতে পারবেন না , কারণ এটি ইকমাস্ক্রিপ্ট 5 নেটিভ আচরণ অনুকরণ করে।


2

আমি বিশ্বাস করি যদি আপনার অ্যারেটি আসলে কোনও জিনিস হয় তবে আপনি খালি বস্তুটি ব্যবহার করে ফিরে আসতে পারেন।

_.({1,2,3,4,5}).each(function(v){  
  if(v===3) return {}; 
});

এটি কেবলমাত্র ইকামাস্ক্রিপ্ট v <5 এর সাথে ঘটে যা তুলনামূলকভাবে আন্ডারস্কোর যা যাচাইয়ের জন্য সরবরাহিত বিকল্পের মধ্যে খালি বস্তুটি ফিরিয়ে দিচ্ছেন কিনা তা পরীক্ষা করতে কেবল তখনই সম্পন্ন হয় যখন নেটিভ পাওয়া যায় না।
আলফোনসো দে লা ওসায়

2

এটি লক্ষ্য করাও ভাল যে প্রতিটি লুপ ভাঙা যায় না - ভাঙ্গতে, পরিবর্তে _.ফাইন্ড ব্যবহার করুন।

http://underscorejs.org/#each


1

হালনাগাদ:

ভিতরে কোনও ত্রুটি নিক্ষেপ করে এবং এর বাইরে ধরা দিয়ে আপনি আসলে "ব্রেক" করতে পারেন: এরকম কিছু:

try{
  _([1,2,3]).each(function(v){
    if (v==2) throw new Error('break');
  });
}catch(e){
  if(e.message === 'break'){
    //break successful
  }
}

স্পষ্টতই এর অন্য কোনও ব্যতিক্রম সম্পর্কিত কিছু বিষয় রয়েছে যা আপনার কোড লুপে ট্রিগার করে, তাই সাবধানতার সাথে ব্যবহার করুন!


ভালবাসা কিভাবে আমি এই জন্য এত নিচে ভোট পেয়েছে, এবং এই লোক তার জন্য আপগুলি একটি সম্পূর্ণ লোড পায় stackoverflow.com/a/2641374/674720
bm_i

1
আমি পার্টিতে দেরি করেছি তবে নোট করুন যে লোকটি আপনার পরামর্শ অনুসারে কেবল যা বলেছিল তা নয়, বরং আরও দুটি বিকল্প প্রস্তাব দিয়েছে (এবং আরও উপযুক্ত)। কেবলমাত্র "হ্যাক" দেওয়ার প্রস্তাব যদি ব্যবহারকারীরা সব উপায়ে চায়। পরিবর্তে আপনি কেবল কুরুচিপূর্ণ হ্যাকের প্রস্তাব দিয়েছিলেন।
আর্কস

0

আমার ক্ষেত্রে কাজ করেছে

var arr2 = _.filter(arr, function(item){
    if ( item == 3 ) return item;
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.