javascript - tutorial - জেকুয়েরি টিউটোরিয়াল




শর্ট সার্কিট অ্যারে। বিরতি কলিং জন্য প্রতিটি (19)

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

কিভাবে আমি জাভাস্ক্রিপ্টে forEach পদ্ধতির জন্য নতুন ব্যবহার করে এই কাজ করতে পারি? আমি return; চেষ্টা করেছি return; return false; এবং break । ক্র্যাশ break এবং return কিছুই কিন্তু পুনরাবৃত্তি অবিরত না।


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

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" }

@Bobince সঙ্গে সম্মত, upvoted।

এছাড়াও, FYI:

Prototype.js এই উদ্দেশ্যে কিছু আছে:

<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 দেখুন।


আগে উল্লিখিত, আপনি বিরতি না করতে পারেন। .forEach()

এখানে ES6 Iterators সঙ্গে একটি foreach করছেন সামান্য আরো আধুনিক উপায়। পুনরাবৃত্তি যখন আপনি 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!

লিংক


আপনার কোডের উদাহরণ থেকে, এটি দেখে মনে হচ্ছে Array.prototype.find আপনি যা খুঁজছেন তা: Array.prototype.find() এবং Array.prototype.findIndex()

[1, 2, 3].find(function(el) {
    return el === 2;
}); // returns 2

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

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

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

[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;
});

যা আপনার কোডের মধ্যে এলোমেলো ত্রুটি নিক্ষেপ একটি অনেক ভাল সমাধান হয়।


আপনি যদি আপনার 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>

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


আমি এটা সঠিক ভাবে জানি না। এটা লুপ বিরতি না। এটি একটি জুগাদ

let result = true;
[1, 2, 3].forEach(function(el) {
    if(result){
      console.log(el);
      if (el === 2){
        result = false;
      }
    }
});


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

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

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

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

ব্যবহার:

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

কিছু tweaking প্রয়োজন হতে পারে, বিশেষ করে বস্তু সম্পত্তি পুনরাবৃত্তি সমর্থন।


এখনো অন্য পদ্ধতি

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

এটি লুপের জন্য, তবে লুপের বস্তুর রেফারেন্সটিকে কেবল একটি forEach () এর মতো বজায় রাখে তবে আপনি তা ভেঙ্গে ফেলতে পারেন।

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

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

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

প্রতিটি জন্য break কোন অন্তর্নিহিত ক্ষমতা আছে। মৃত্যুদন্ড কার্যকর করার জন্য আপনাকে কোন ধরণের ব্যতিক্রমগুলি নিক্ষেপ করতে হবে। যেমন।

var BreakException = {};

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

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

Array#some ব্যবহার করুন

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

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

এটি কাজ করে কারণ some শীঘ্রই কলব্যাকগুলির মতই true ফেরত দেয়, অ্যারে ক্রমের মধ্যে মৃত্যুদন্ড কার্যকর করা হয়, true ফেরত দেয়, বাকিগুলি কার্যকর করার স্বল্প-সার্কিট করে।

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


সংক্ষিপ্ত উত্তর: এর for...break ব্যবহার for...break দিন অথবা আপনার কোডটি ভঙ্গ করতে এড়াতে আপনার কোডটি পরিবর্তন করুন। .some() জন্য .some() বা .some() ব্যবহার করতে না। for...break লুপ for...break আপনার কোড পুনর্বিবেচনা, বা জন্য for...break । প্রত্যেক সময় যখন আপনি এই পদ্ধতিগুলি for...break বিকল্প for...break ঈশ্বর বিড়ালকে হত্যা করে।

দীর্ঘ উত্তর:

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

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

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

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


সঠিক উত্তর আপনি এই কাজ করতে চান উপর নির্ভর করে।

আপনি যদি যা চান তা হল: "যতটুকু সম্ভব সেই break প্রদানে যতটুকু সম্ভব তার থেকে সম্পূর্ণ ভাঙার উপায় পরিষ্কার এবং সংক্ষেপিত নয়" তাহলে আপনি Array.forEach () এটিকে পুনরায় সংজ্ঞায়িত করতে পারেন:

[1,2,3,4,5].forEach((x,i,stop) => { // x and i are the standard 2 args
  if (x > 3) {
    stop() // You could call it 'end', 'brk' or whatever...
  }
  console.log(x)
})

এখানে ওভাররাইড, নোট করুন যে forEach() সাধারণত স্বাভাবিকভাবে দুটি প্যারামিটার পাস করে: বর্তমান পুনরাবৃত্ত বস্তু এবং সূচী। আমরা শুধু একটি তৃতীয় যোগ করছি:

Array.prototype.forEach = function(fn) {
  var StopIteration = new Error("StopIteration");
  var len = this.length;
  function stop() {
    throw StopIteration;
  }
  for (i=0;i<len;i++) {
    try {
      fn(this[i], i, stop)
    } 
    catch(e) {
      if(e == StopIteration) {
        return
      }
      throw e;
    }
  }
}

আপনি যে কোনও নামটি ব্যবহার করতে পারেন ( break ব্যতীত বা অন্য কোনও সংরক্ষিত কীওয়ার্ড, সেখানে কোন ভাগ্য নেই!)

(একটি বাস্তব প্রকল্পে আপনাকে অবশ্যই অতি উত্তম উত্তরগুলির মধ্যে একটিতে যেতে হবে। আমি এইটিকে যুক্ত করছি কারণ কিছু লোক এই অ্যাপ্লিকেশনটিকে অন্যান্য অ্যাপ্লিকেশনে কাজে লাগাতে পারে)।


লুপের জন্য নতুন ব্যবহার করে ECMAScript2015 (aka 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;
  }
}

ডক্স থেকে:

উভয় ... এর জন্য এবং এর বিবৃতির উপর কিছু পুনরাবৃত্তি। তাদের মধ্যে প্রধান পার্থক্য তারা কি পুনরাবৃত্তি হয়। জন্য ... বিবৃতি ইন একটি বস্তুর সংখ্যার বৈশিষ্ট্য, প্রকৃত সন্নিবেশ আদেশের উপর পুনরাবৃত্তি। এর জন্য ... বিবৃতির তথ্য পুনরাবৃত্তি করে যা পুনরাবৃত্ত বস্তুটি পুনরাবৃত্তি করা হয়।

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

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


var Book = {"Titles":[                          
    {
    "Book3" : "BULLETIN 3"
    }   
    ,
    {
    "Book1" : "BULLETIN 1"
    }
    ,
    {
    "Book2" : "BULLETIN 2"
    }    
]}

var findbystr = function(str) { 
    var return_val;
    Book.Titles.forEach(function(data){ 
        if(typeof data[str] != 'undefined')
        {
            return_val = data[str];
        } 
    }, str) 

    return return_val;
}

book = findbystr('Book1');
console.log(book);






arrays