ก่อนการแนะนำให้โยนคำถาม: วิธีรวมหลายอาร์เรย์เป็นอาร์เรย์เดียว?
เซสชันการแบ่งปันต่อไปนี้แบ่งออกเป็นส่วนย่อยต่อไปนี้:
1. การแนะนำขั้นพื้นฐานเกี่ยวกับวิธีการ concat
2. รู้สึกถึงวิธีการ concat จากตัวอย่าง
1. การแนะนำขั้นพื้นฐานเกี่ยวกับวิธีการ concat
วิธีการ concat ใช้สำหรับการรวมหลายอาร์เรย์ มันเพิ่มสมาชิกของอาร์เรย์ใหม่ในตอนท้ายของอาร์เรย์ดั้งเดิมจากนั้นส่งคืนอาร์เรย์ใหม่อาร์เรย์ดั้งเดิมยังคงไม่เปลี่ยนแปลง
console.log ([]. concat ([1], [2], [3])); // [1, 2, 3] console.log ([]. concat ([[1], [2], [3]])); // [1], [2], [3]] console.log ([]. concat (4, [[5,6], [7]])); // [4, [5, 6], [7]]
ในรหัสข้างต้นค่าส่งคืนครั้งแรกคือการรวมอาร์เรย์ที่ว่างเปล่ากับสามอาร์เรย์ [1], [2], [3] ลงในอาร์เรย์ดังนั้นจึงส่งคืน [1, 2, 3] ประการที่สองคือการรวมอาร์เรย์ที่ว่างเปล่าเข้ากับหมายเลขสองมิติ สมาชิกของอาเรย์สองมิติคือ [1], [2], [3], ดังนั้น [[1], [2], [3]] จะถูกส่งกลับ โปรดทราบว่าอาร์เรย์สองมิติที่ส่งคืน ตัวอย่างที่สามเหมือนกัน ความเข้าใจในแนวคิดมีความสำคัญมากที่นี่นั่นคือการเพิ่มสมาชิกของอาเรย์ใหม่ลงในหางของอาร์เรย์ดั้งเดิม
นอกเหนือจากการยอมรับอาร์เรย์เป็นพารามิเตอร์แล้ว CONCAT ยังสามารถยอมรับค่าประเภทอื่นเป็นพารามิเตอร์ พวกเขาจะถูกใช้เป็นองค์ประกอบใหม่เพิ่มจุดสิ้นสุดของอาร์เรย์
console.log ([]. concat (1,2,3)); // [1,2,3]; // เทียบเท่ากับ console.log ([]. concat (1, [2,3])); // [1,2,3]; console.log ([]. concat ([1], [2,3])); // [1,2,3];
แม้ว่าจะมีเนื้อหาน้อยกว่าที่นี่ แต่ก็ดูค่อนข้างง่าย แต่มันไม่ใช่เรื่องง่ายที่จะเข้าใจ
2. รู้สึกถึงวิธีการ concat จากตัวอย่าง
หลังจากพูดคุยเกี่ยวกับความรู้พื้นฐานให้ฉันแสดงคำถามที่ฉันได้พบเมื่อเร็ว ๆ นี้ ชื่อเดิมเป็นเช่นนี้
คุณสามารถดูว่ามันหมายถึงอะไรโดยดูตัวอย่าง
หนึ่งในวิธีแก้ปัญหาสำหรับคำถามนี้คือ:
var flatten = function (arr) {return [] .concat.apply ([], arr);};ฟังก์ชั่นง่าย ๆ นี้สามารถตระหนักถึงฟังก์ชั่นของการรวมองค์ประกอบในอาร์เรย์ แต่เมื่อฉันเข้าใจค่าคืนนี้ปัญหาจะเกิดขึ้น
คำถาม: เหตุใดจึงมีความแตกต่างระหว่างการใช้วิธีการสมัครและไม่ใช้วิธีการสมัคร
console.log ([]. concat.apply ([], [[1], [2], [3]])); // [1, 2, 3] console.log ([]. concat ([[1], [2], [3]])); // [[1], [2], [3]]
ในรหัสข้างต้นจะมีการเพิ่มอาร์เรย์ใหม่ลงในหางในอาร์เรย์ที่ว่างเปล่าและอันแรกที่ส่งคืน [1,2,3] อันที่สองคืออาร์เรย์สองมิติ
หลังจากช่วงเวลาของการโยนและไล่ล่าในที่สุดฉันก็เข้าใจเหตุผลที่แตกต่างกัน
ก่อนอื่นเมื่อเราเรียกวิธีการอินสแตนซ์ในอาร์เรย์ที่ว่างเปล่าเราจะผ่านพารามิเตอร์ใน concat และผลักไปที่ส่วนท้ายของอาร์เรย์ นั่นคืออาร์เรย์ที่ว่างเปล่าถูกรวมเข้ากับอาร์เรย์ด้านนอกสุดของอาร์เรย์ที่ผ่านมาและจากนั้นอาร์เรย์ใหม่จะถูกส่งคืน
console.log ([]. concat (1,2,3)); // [1, 2, 3] console.log ([]. concat ([1], [2], [3])); // [1, 2, 3] console.log ([]. concat ([[1], [2], [3]])); // [1], [2], [3]] console.log ([]. concat ([[1], [2], [3]])); // [[1], [2], [3]]]
ในรหัสข้างต้นจะค่อยๆเปลี่ยนจากหลายอาร์เรย์เป็นอาร์เรย์หนึ่งมิติอาร์เรย์สองมิติและอาร์เรย์สามมิติ
ในคำอธิบายโดยละเอียดและบทความสรุปของการเรียกใช้และวิธีการผูกในจาวาสคริปต์มีการกล่าวถึงว่าฟังก์ชันของวิธีการใช้นั้นคล้ายกับวิธีการโทรและยังเปลี่ยนจุดนี้ (ขอบเขตที่ฟังก์ชันถูกดำเนินการ) จากนั้นเรียกฟังก์ชันในขอบเขตที่ระบุ ฟังก์ชั่นจะถูกดำเนินการทันที ความแตกต่างเพียงอย่างเดียวคือได้รับอาร์เรย์เป็นอาร์กิวเมนต์เมื่อฟังก์ชั่นถูกเรียกใช้งาน
พารามิเตอร์แรกของวิธีการใช้เป็นวัตถุที่ต้องการชี้ไปที่ หากตั้งค่าเป็น NULL หรือไม่ได้กำหนดหรือสิ่งนี้จะเทียบเท่ากับการระบุวัตถุทั่วโลก พารามิเตอร์ที่สองคืออาร์เรย์และสมาชิกทั้งหมดของอาร์เรย์จะใช้เป็นพารามิเตอร์ในทางกลับกันและฟังก์ชั่นดั้งเดิมจะถูกส่งผ่านเมื่อเรียก พารามิเตอร์ของฟังก์ชั่นดั้งเดิมจะต้องเพิ่มทีละหนึ่งในวิธีการโทร แต่ในวิธีการใช้จะต้องเพิ่มเป็นอาร์เรย์
console.log ([]. concat.apply ([], [[1], [2], [3]])); // [1, 2, 3] console.log ([]. concat ([[1], [2], [3]])); // [[1], [2], [3]]
ดังที่เห็นได้จากรหัสชิ้นส่วนแรกของรหัสเรียกใช้วิธีการ concat ก่อนในอาร์เรย์ที่ว่างเปล่า ฟังก์ชั่นของวิธีนี้คือการเพิ่มสมาชิกของอาร์เรย์ใหม่ในตอนท้ายของอาร์เรย์ดั้งเดิม วิธีการสมัครจะถูกเรียกอีกครั้งและพารามิเตอร์แรกจะถูกส่งผ่านโดยระบุขอบเขตของวัตถุที่ถูกดำเนินการ ฟังก์ชั่นของพารามิเตอร์ที่สองคือการส่งสมาชิกทั้งหมดของอาร์เรย์เป็นพารามิเตอร์ในครั้งเดียวและส่งผ่านไปยังอาร์เรย์เมื่อเรียก
ดังนั้นเมื่อมีการใช้วิธีการและวิธีการใช้ในเวลาเดียวกันฟังก์ชั่นของทั้งสองวิธีจะถูกซ้อนทับซึ่งเป็นปรากฏการณ์ที่แตกต่างจากการใช้ concat เพียงอย่างเดียว มาดูตัวอย่าง
console.log ([]. concat ([1,2,3])); // [1, 2, 3] console.log ([]. concat.apply ([], [[1], [2], [3]])); // [1, 2, 3] console.log ([]. concat ([[1], [2], [3]])); // [1], [2, [3]] console.log ([]. concat ([[1], [2], [3]])); // [[1], [2], [3]] console.log ([]. concat ([[1], [2], [3]])); // [[1], [2], [3]] console.log ([]. concat ([[1], [2], [3]]])); // [[1], [2], [3]] console.log ([]. concat ([[1], [2], [2], [3]] console.log ([]. concat.apply (] [[[1], [2], [3]]); [3]]]
ในรหัสข้างต้นวิธีการ concat รวมตัวเลขมากที่สุดจากนั้นรวมอาร์เรย์เลเยอร์ถัดไปบนพื้นฐานของการผสาน
console.log ([]. concat.apply ([], [[1], [2], [3]])); // [1, 2, 3] // เทียบเท่ากับ console.log ([]. concat (1,2,3)); // [1,2,3]
สรุป:
1. เมื่อใช้วิธีการ concat เพียงอย่างเดียวสมาชิกของอาร์เรย์ใหม่จะถูกเพิ่มในตอนท้ายของอาร์เรย์ดั้งเดิม
2. เมื่อใช้วิธีการใช้เพื่อระบุตัวชี้นี้ของวิธีการ concat ฟังก์ชั่นของทั้งสองวิธีจะถูกซ้อนทับ
3. วิธีการรวมองค์ประกอบอาร์เรย์:
var flatten = function (arr) {return [] .concat.apply ([], arr);}; var flatten = function (array) {return array.Reduce (ฟังก์ชั่น (a, b) {return a.concat (b);}, [])}ข้างต้นเป็นวิธีการรวมอาร์เรย์โดยใช้วิธีการเชื่อมต่อที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!