ฉันพยายามที่จะวนรอบอาร์เรย์ ฉันมีรหัสต่อไปนี้:
var currnt_image_list= '21,32,234,223';
var substr = currnt_image_list.split(','); // array here
กำลังพยายามดึงข้อมูลทั้งหมดออกจากอาร์เรย์ ใครบางคนสามารถพาฉันไปในเส้นทางที่ถูกต้องได้ไหม
ฉันพยายามที่จะวนรอบอาร์เรย์ ฉันมีรหัสต่อไปนี้:
var currnt_image_list= '21,32,234,223';
var substr = currnt_image_list.split(','); // array here
กำลังพยายามดึงข้อมูลทั้งหมดออกจากอาร์เรย์ ใครบางคนสามารถพาฉันไปในเส้นทางที่ถูกต้องได้ไหม
คำตอบ:
(อัปเดต: คำตอบอื่นของฉันที่นี่แสดงตัวเลือกที่ไม่ใช่ jQuery อย่างละเอียดยิ่งขึ้นตัวเลือกที่สามด้านล่างjQuery.each
ไม่ได้อยู่ในนั้น)
สี่ตัวเลือก:
var i;
for (i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
หรือใน ES2015 +:
for (let i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
ข้อดี : ตรงไปข้างหน้าไม่มีการพึ่งพา jQuery ง่ายต่อการเข้าใจไม่มีปัญหาเกี่ยวกับการรักษาความหมายของthis
ภายในร่างกายของลูปไม่มีค่าใช้จ่ายในการเรียกใช้ฟังก์ชันที่ไม่จำเป็น (เช่นในทางทฤษฎีเร็วขึ้นถึงแม้ว่าคุณจะต้อง มีองค์ประกอบมากมายที่คุณมีปัญหาอื่น ๆรายละเอียด )
forEach
:ในฐานะของ ECMAScript5 อาร์เรย์มีforEach
ฟังก์ชั่นซึ่งทำให้ง่ายต่อการวนรอบอาร์เรย์:
substr.forEach(function(item) {
// do something with `item`
});
(หมายเหตุ: มีฟังก์ชั่นอื่น ๆ อีกมากมายไม่ใช่เพียงforEach
ดูคำตอบที่อ้างถึงข้างต้นสำหรับรายละเอียด)
ข้อดี : การประกาศสามารถใช้ฟังก์ชัน prebuilt สำหรับตัววนซ้ำถ้าคุณมีประโยชน์ถ้าตัวลูปของคุณซับซ้อนการกำหนดขอบเขตของการเรียกฟังก์ชันบางครั้งก็มีประโยชน์ไม่จำเป็นต้องมีi
ตัวแปรในขอบเขตที่มี
ข้อเสีย : ถ้าคุณใช้this
ในรหัสที่มีและคุณต้องการใช้this
ในการforEach
ติดต่อกลับของคุณคุณต้อง A) ติดไว้ในตัวแปรเพื่อให้คุณสามารถใช้มันในฟังก์ชั่น B) ผ่านมันเป็นอาร์กิวเมนต์ที่สองเพื่อforEach
ให้forEach
ชุดว่ามันเป็นthis
ช่วงโทรกลับหรือ C) ใช้ ES2015 + ลูกศรฟังก์ชั่นthis
ซึ่งปิดมากกว่า หากคุณไม่ได้ทำสิ่งใดสิ่งหนึ่งเหล่านั้นในการติดต่อกลับthis
จะเป็นundefined
(ในโหมดเข้มงวด) หรือวัตถุทั่วโลก ( window
) ในโหมดหลวม เคยมีข้อเสียที่สองซึ่งforEach
ไม่รองรับในระดับสากล แต่ที่นี่ในปี 2018 เบราว์เซอร์เดียวที่คุณจะพบซึ่งไม่มีforEach
คือ IE8 (และไม่สามารถทำได้อย่างถูกต้อง polyfilled ตรงนั้น)
for-of
:for (const s of substr) { // Or `let` if you want to modify it in the loop body
// do something with `s`
}
ดูคำตอบที่ลิงก์ด้านบนของคำตอบนี้สำหรับรายละเอียดเกี่ยวกับวิธีการทำงาน
ข้อดี : เรียบง่ายตรงไปตรงมานำเสนอตัวแปรขอบเขตที่มีอยู่ (หรือค่าคงที่ด้านบน) สำหรับรายการจากอาร์เรย์
ข้อเสีย : ไม่รองรับใน IE เวอร์ชันใด ๆ
jQuery.each(substr, function(index, item) {
// do something with `item` (or `this` is also `item` if you like)
});
( ลิงก์ไปยังเอกสาร )
ข้อดี : ข้อดีเดียวกันทั้งหมดforEach
รวมทั้งคุณทราบว่ามีอยู่เมื่อคุณใช้ jQuery
ข้อเสีย : ถ้าคุณใช้this
ในรหัสที่มีคุณจะต้องติดมันในตัวแปรเพื่อให้คุณสามารถใช้มันในฟังก์ชั่นเนื่องจากthis
หมายถึงสิ่งอื่นในฟังก์ชั่น
คุณสามารถหลีกเลี่ยงthis
สิ่งนั้นโดยใช้$.proxy
:
jQuery.each(substr, $.proxy(function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}, this));
... หรือFunction#bind
:
jQuery.each(substr, function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}.bind(this));
... หรือใน ES2015 ("ES6") ฟังก์ชั่นลูกศร:
jQuery.each(substr, (index, item) => {
// do something with `item` (`this` is the same as it was outside)
});
อย่าใช้for..in
เพื่อสิ่งนี้ (หรือถ้าคุณใช้ให้ทำอย่างปลอดภัย) คุณจะเห็นคนพูด (จริงๆแล้วมีคำตอบสั้น ๆ ว่าที่นี่) แต่for..in
ไม่ได้ทำในสิ่งที่หลายคนคิดว่าทำ (มันทำสิ่งที่มีประโยชน์มากยิ่งขึ้น!) โดยเฉพาะfor..in
ลูปผ่านชื่อคุณสมบัติที่นับได้ของวัตถุ (ไม่ใช่ดัชนีของอาร์เรย์) เนื่องจากอาร์เรย์เป็นวัตถุและคุณสมบัตินับเฉพาะของพวกเขาโดยค่าเริ่มต้นคือดัชนีจึงดูเหมือนว่าส่วนใหญ่จะเรียงลำดับของงานในการปรับใช้อ่อนโยน แต่ไม่ใช่ข้อสันนิษฐานที่ปลอดภัยที่คุณสามารถใช้เพื่อสิ่งนั้นได้ นี่คือการสำรวจ: http://jsbin.com/exohi/3
ฉันควรทำให้คำว่า "ไม่" อ่อนลง หากคุณกำลังยุ่งกับอาร์เรย์กระจัดกระจาย (เช่นอาร์เรย์มีองค์ประกอบทั้งหมด 15 รายการ แต่ดัชนีของพวกเขาจะเต็มไปด้วยช่วง 0 ถึง 150,000 ด้วยเหตุผลบางอย่างและเช่นนั้นlength
คือ 150,001) และถ้าคุณใช้การป้องกันที่เหมาะสมเช่นhasOwnProperty
และการตรวจสอบ ชื่อคุณสมบัติเป็นตัวเลขจริงๆ (ดูลิงก์ด้านบน) for..in
สามารถเป็นวิธีที่เหมาะสมที่สุดในการหลีกเลี่ยงการวนซ้ำที่ไม่จำเป็นจำนวนมากเนื่องจากจะมีการแจกแจงเฉพาะดัชนีที่มีประชากร
Function#bind
หรือ :-) จุดดีเพิ่ม
i++
และ++i
เป็นผลลัพธ์ของนิพจน์นั้นซึ่งไม่เคยใช้ในตัวอย่างด้านบน การfor
วนซ้ำทำงานเช่นนี้: 1. การเริ่มต้น, 2. ทดสอบ (ยุติถ้าเป็นเท็จ), 3. ร่างกาย, 4. อัปเดต, 5. กลับไปที่ขั้นตอนที่ 2 ผลลัพธ์ของนิพจน์การอัปเดตจะไม่ถูกนำไปใช้
jQuery.each(array, callback)
การวนซ้ำอาร์เรย์
jQuery.each(array, function(Integer index, Object value){});
การวนซ้ำวัตถุ
jQuery.each(object, function(string propertyName, object propertyValue){});
ตัวอย่าง :
var substr = [1, 2, 3, 4];
$.each(substr , function(index, val) {
console.log(index, val)
});
var myObj = { firstName: "skyfoot"};
$.each(myObj, function(propName, propVal) {
console.log(propName, propVal);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
สำหรับวง
for (initialExpression; condition; incrementExpression)
statement
ตัวอย่าง
var substr = [1, 2, 3, 4];
//loop from 0 index to max index
for(var i = 0; i < substr.length; i++) {
console.log("loop", substr[i])
}
//reverse loop
for(var i = substr.length-1; i >= 0; i--) {
console.log("reverse", substr[i])
}
//step loop
for(var i = 0; i < substr.length; i+=2) {
console.log("step", substr[i])
}
สำหรับใน
//dont really wnt to use this on arrays, use it on objects
for(var i in substr) {
console.log(substr[i]) //note i returns index
}
สำหรับของ
for(var i of subs) {
//can use break;
console.log(i); //note i returns value
}
แต่ละ
substr.forEach(function(v, i, a){
//cannot use break;
console.log(v, i, a);
})
ไม่จำเป็นต้อง jQuery ที่นี่เพียงแค่for
วงวน:
var substr = currnt_image_list.split(',');
for(var i=0; i< substr.length; i++) {
alert(substr[i]);
}
for
-loop แบบดั้งเดิมดั้งเดิม - for
ลูปมีสามองค์ประกอบ:
ส่วนประกอบทั้งสามนี้แยกจากกันโดยใช้;
สัญลักษณ์ เนื้อหาสำหรับแต่ละองค์ประกอบทั้งสามนี้เป็นตัวเลือกซึ่งหมายความว่าสิ่งต่อไปนี้เป็นส่วนที่เล็กที่สุดที่for
เป็นไปได้:
for (;;) {
// Do stuff
}
แน่นอนว่าคุณจะต้องรวมif(condition === true) { break; }
สิ่งif(condition === true) { return; }
ใดสิ่งหนึ่งไว้ข้างในนั้นfor
เพื่อให้มันหยุดทำงาน
โดยทั่วไปแม้ว่าการกำหนดค่าเริ่มต้นจะใช้ในการประกาศดัชนีเงื่อนไขที่ใช้ในการเปรียบเทียบดัชนีนั้นกับค่าต่ำสุดหรือค่าสูงสุดและใช้ภายหลังเพื่อเพิ่มดัชนี:
for (var i = 0, length = 10; i < length; i++) {
console.log(i);
}
for
-loop เพื่อวนลูปผ่านอาร์เรย์วิธีดั้งเดิมในการวนซ้ำผ่านอาร์เรย์คือ:
for (var i = 0, length = myArray.length; i < length; i++) {
console.log(myArray[i]);
}
หรือถ้าคุณต้องการวนซ้ำไปข้างหลังคุณทำสิ่งนี้:
for (var i = myArray.length - 1; i > -1; i--) {
console.log(myArray[i]);
}
อย่างไรก็ตามมีหลายรูปแบบที่เป็นไปได้เช่น อันนี้ :
for (var key = 0, value = myArray[key], var length = myArray.length; key < length; value = myArray[++key]) {
console.log(value);
}
... หรืออันนี้ ...
var i = 0, length = myArray.length;
for (; i < length;) {
console.log(myArray[i]);
i++;
}
... หรืออันนี้:
var key = 0, value;
for (; value = myArray[key++];){
console.log(value);
}
สิ่งที่ได้ผลดีที่สุดส่วนใหญ่เป็นเรื่องของรสนิยมส่วนตัวและกรณีการใช้งานเฉพาะที่คุณกำลังนำไปใช้
บันทึก :แต่ละรูปแบบเหล่านี้ได้รับการสนับสนุนโดยเบราว์เซอร์ทั้งหมดรวมถึงรุ่นเก่า!
while
-loopทางเลือกหนึ่งสำหรับfor
-loop คือwhile
-loop ในการวนซ้ำอาร์เรย์คุณสามารถทำได้:
var key = 0;
while(value = myArray[key++]){
console.log(value);
}
บันทึก :
เช่นเดียวกับfor
-loops แบบดั้งเดิม-loops while
ได้รับการสนับสนุนแม้กระทั่งเบราว์เซอร์ที่เก่าแก่ที่สุด
นอกจากนี้ทุกวงในขณะที่สามารถเขียนใหม่เป็นfor
-loop ตัวอย่างเช่นwhile
-loop hereabove จะทำงานในลักษณะเดียวกันกับfor
-loop นี้:
for(var key = 0;value = myArray[key++];){
console.log(value);
}
for...in
และfor...of
ใน JavaScript คุณสามารถทำสิ่งนี้ได้:
for (i in myArray) {
console.log(myArray[i]);
}
สิ่งนี้ควรใช้ด้วยความระมัดระวังเนื่องจากมันไม่ได้มีพฤติกรรมเหมือนกับแบบดั้งเดิม - for
ลูปในทุกกรณีและมีผลข้างเคียงที่อาจเกิดขึ้นที่ต้องพิจารณา ดูเหตุใดการใช้ "for ... in" กับการทำซ้ำอาร์เรย์จึงเป็นความคิดที่ไม่ดี สำหรับรายละเอียดเพิ่มเติม
เป็นทางเลือกกับผู้มีตอนนี้ยังfor...in
for...of
ตัวอย่างต่อไปนี้แสดงความแตกต่างระหว่างfor...of
ลูปและfor...in
ลูป:
var myArray = [3, 5, 7];
myArray.foo = "hello";
for (var i in myArray) {
console.log(i); // logs 0, 1, 2, "foo"
}
for (var i of myArray) {
console.log(i); // logs 3, 5, 7
}
บันทึก :
คุณต้องพิจารณาด้วยว่าไม่มีรุ่นของ Internet Explorer ที่รองรับfor...of
( Edge 12+ทำ) และfor...in
ต้องใช้อย่างน้อย IE10
Array.prototype.forEach()
ทางเลือกอื่นสำหรับFor
-loops คือArray.prototype.forEach()
ซึ่งใช้ไวยากรณ์ต่อไปนี้:
myArray.forEach(function(value, key, myArray) {
console.log(value);
});
บันทึก :
Array.prototype.forEach()
ได้รับการสนับสนุนโดยเบราว์เซอร์ที่ทันสมัยทั้งหมดเช่นเดียวกับ IE9 +
jQuery.each()
นอกจากตัวเลือกอื่นที่กล่าวถึงสี่ตัว jQuery ยังมีforeach
รูปแบบของตัวเอง
มันใช้ไวยากรณ์ต่อไปนี้:
$.each(myArray, function(key, value) {
console.log(value);
});
ใช้each()
ฟังก์ชั่นของ jQuery
นี่คือตัวอย่าง:
$.each(currnt_image_list.split(','), function(index, value) {
alert(index + ': ' + value);
});
ใช้ each()
jQuery มีวิธีอื่น ๆ แต่แต่ละวิธีออกแบบมาเพื่อจุดประสงค์นี้
$.each(substr, function(index, value) {
alert(value);
});
และอย่าใส่เครื่องหมายจุลภาคหลังตัวเลขสุดท้าย
คุณสามารถใช้การfor()
วนซ้ำ:
var things = currnt_image_list.split(',');
for(var i = 0; i < things.length; i++) {
//Do things with things[i]
}
ไวยากรณ์ ES6 พร้อมฟังก์ชันลูกศรและการแก้ไข:
var data=["a","b","c"];
$(data).each((index, element) => {
console.log(`current index : ${index} element : ${element}`)
});
ลองสิ่งนี้:
$.grep(array, function(element) {
})
วิธีทางเลือกของการทำซ้ำผ่านอาร์เรย์ / สตริงที่มีผลข้างเคียง
var str = '21,32,234,223';
var substr = str.split(',');
substr.reduce((a,x)=> console.log('reduce',x), 0) // return undefined
substr.every(x=> { console.log('every',x); return true}) // return true
substr.some(x=> { console.log('some',x); return false}) // return false
substr.map(x=> console.log('map',x)); // return array
str.replace(/(\d+)/g, x=> console.log('replace',x)) // return string
.each()
หรือfor...in
เพื่อวนรอบอาร์เรย์โดยทั่วไปเป็นความคิดที่ไม่ดี ก็เช่นเดียวกับทุกเพศทุกวัยช้ากว่าการใช้หรือfor
while
ใช้เป็นfor loop
ความคิดที่ดีในการแคชlength
คุณสมบัติก่อนที่จะวนซ้ำfor (var i = 0, len = substr.length; i < len; ...