วิธีการข้ามไปยังการทำซ้ำครั้งถัดไปใน jQuery.each () util


434

ฉันพยายามวนซ้ำองค์ประกอบต่างๆ เอกสารของ jQuery พูดว่า:

เอกสาร jquery.Each ()

การส่งกลับค่าที่ไม่ใช่เท็จนั้นเหมือนกับคำสั่ง continue ใน a for loop มันจะข้ามไปที่การวนซ้ำถัดไปทันที

ฉันลองโทรหา 'return non-false;' และ 'ไม่ใช่เท็จ' (sans กลับมา) ทั้งที่ไม่ข้ามไปยังการทำซ้ำต่อไป แต่พวกเขาทำลายวง ฉันกำลังคิดถึงอะไร


9
ในภูมิปัญญาอนันต์ของพวกเขา bods ที่ jQuery ได้เอาออกตอนนี้บันทึกนี้จากเอกสาร - หรืออย่างน้อยก็ไม่ได้อยู่ในหน้าสำหรับแต่ละ () ดังนั้นฉันดีใจมากที่เห็นคำถามนี้ยังสามารถพบได้ที่นี่ใน SO และโดยการขยายใน Google เนื่องจากนี่เป็นหนึ่งในสิ่งง่าย ๆ ที่ฉันมักจะลืม :)
Doug McLean

คำตอบ:


783

สิ่งที่พวกเขาหมายถึงโดยไม่ใช่เท็จคือ:

return true;

ดังนั้นรหัสนี้:

var arr = ["one", "two", "three", "four", "five"];
$.each(arr, function(i) {
  if (arr[i] == 'three') {
    return true;
  }
  console.log(arr[i]);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

จะเข้าสู่ระบบone, two, ,fourfive


16
หากต้องการออกเฉพาะการทำซ้ำปัจจุบันเท่านั้นก็เพียงพอแล้วที่จะส่งคืน 'ผลตอบแทน' และเพื่อออกจากการทำซ้ำทั้งหมดไปข้างหน้ากลับเท็จ
Saulius

7
มันคุ้มที่จะบอกว่ามันใช้งานได้เพราะคุณอยู่ในฟังก์ชั่นเมื่อเรียกใช้โค้ด
Ukuser32

เมื่อฉันกลับมา (arr [i] === 'สาม'); ทำไมมันไม่ทำงาน ??
ajayv

สำหรับฉันค่าเฉลี่ยที่ไม่ใช่เท็จคุณสามารถคืนสิ่งใดก็ได้ยกเว้นคืนค่าเท็จ
Hoang Trung

61

โดย 'return non-false' พวกเขาหมายถึงการคืนค่าใด ๆ ที่ไม่ได้ผลในการบูลีน false ดังนั้นคุณจะกลับมาtrue, 1, 'non-false'หรือสิ่งอื่นที่คุณสามารถคิดขึ้น


20
ทำไมไม่เพียงเพื่อเห็นแก่ประโยชน์ "คืน" ทำต่อ ";"
Alexander Mills

เกี่ยวกับการดำเนินการต่อ; ที่ทำงานในรูปแบบของ C คมฉันทำงานด้วยดังนั้นฉันคาดเดาเท่านั้นว่ามันจะมีผลคล้ายกันใน JS
Brandito

@Brandito มันไม่ได้ทำงานเหมือนวนรอบปกติ - มันกำลังเรียกฟังก์ชั่นวนซ้ำดังนั้นในการวนรอบเพื่อดำเนินการต่อคุณต้องสิ้นสุดการประมวลผลภายในฟังก์ชั่น
TJ L

5

การเรียงลำดับของ Javascript มีแนวคิดของ 'ความจริง' และ 'ความเท็จ' หากตัวแปรมีค่าแล้วโดยทั่วไปคุณจะเห็นว่า 9) มันมี 'ความจริง' - เป็นโมฆะหรือไม่มีค่าใดที่มีแนวโน้ม 'เท็จ' ตัวอย่างด้านล่างอาจช่วยได้:

var temp1; 
if ( temp1 )...  // false

var temp2 = true;
if ( temp2 )...  // true

var temp3 = "";
if ( temp3 ).... // false

var temp4 = "hello world";
if ( temp4 )...  // true

หวังว่าจะช่วยได้?

นอกจากนี้ยังควรตรวจสอบวิดีโอเหล่านี้จาก Douglas Crockford ด้วย

อัปเดต: ขอบคุณ @cphpython สำหรับการพบจุดเชื่อมโยงที่เสียหาย - ฉันได้รับการอัพเดตให้ชี้ไปที่เวอร์ชันการทำงานทันที

ภาษาจาวาสคริปต์

Javascript - ส่วนที่ดี


1
ลิงก์เสีย ... Btw 0ก็เป็นค่าที่ไม่แน่นอนและการปฏิเสธมันก็เป็นความจริง (และในทางกลับกันกับตัวเลขอื่น ๆ เช่น!-42 === false)
CPHPython

4

อย่าลืมว่าบางครั้งคุณก็สามารถหลุดออกจากจุดสิ้นสุดของบล็อกเพื่อไปที่การทำซ้ำต่อไป:

$(".row").each( function() {
    if ( ! leaveTheLoop ) {
        ... do stuff here ...
    }
});

แทนที่จะกลับมาจริงเช่นนี้:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});

3
ฉันไม่ได้ตั้งใจจะหยาบคาย แต่เป็นการออกแบบที่น่ากลัวอย่างเจ็บปวด ฉันหมายถึง ... ฉันทำไปแล้วในช่วง 2 ปีแรกของการเรียนเมื่อฉันไม่รู้ดีกว่านี้ (ถึงตอนนั้นฉันก็ไม่ชอบ) แต่ก็ไม่ใช่สิ่งที่ควรได้
รับคำแนะนำ

@ DanielParejoMuñozฉันได้ยินคุณ แต่เราไม่เห็นด้วย ตัวเลือกที่ไม่มีคำสั่งส่งคืนอาจไม่ใช่สิ่งที่คุณต้องการ แต่ฉันจะส่งมันเป็นสิ่งที่ชอบ / ไม่ชอบมากกว่าสิ่งที่ดี / ไม่ดี ไม่มีข้อได้เปรียบที่ชัดเจน
Lee Meador

4
นี้มีข้อเสียของการทำรังที่เพิ่มขึ้น
เดฟ Cousineau

3

ห่วงเพียงfalseแบ่งถ้าคุณกลับมาอย่างแท้จริง Ex:

// this is how jquery calls your function
// notice hard comparison (===) against false
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
   break;
}

ซึ่งหมายความว่าคุณสามารถส่งคืนสิ่งอื่นได้รวมถึงundefinedซึ่งเป็นสิ่งที่คุณส่งคืนหากคุณไม่คืนสิ่งใดดังนั้นคุณสามารถใช้คำสั่งการส่งคืนที่ว่างเปล่า:

$.each(collection, function (index, item) {
   if (!someTestCondition)
      return; // go to next iteration

   // otherwise do something
});

เป็นไปได้ว่าสิ่งนี้อาจแตกต่างกันไปตามรุ่น ใช้ได้กับ jquery 1.12.4 แต่จริงๆเมื่อคุณออกจากด้านล่างของฟังก์ชั่นที่คุณยังกลับไม่มีอะไรและที่ว่าทำไมห่วงอย่างต่อเนื่องดังนั้นผมจะคาดหวังว่ามีความเป็นไปได้ใด ๆ ที่กลับมาไม่มีอะไรจะไม่ดำเนินการต่อห่วง ยกเว้นในกรณีที่พวกเขาต้องการที่จะบังคับให้ทุกคนที่จะเริ่มกลับมาบางสิ่งบางอย่างที่จะทำให้วงจะกลับมาไม่มีอะไรที่มีจะเป็นวิธีการที่จะให้มันไป


-3

jQuery.noop ()สามารถช่วยได้

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});

ไม่ฟังก์ชั่น noop () นี้ไม่ได้ช่วย แต่อย่างใด ใช้งานได้เนื่องจากบล็อก "else" ไม่ได้เปิดใช้งาน
Rauni Lillemets
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.