มีคำตอบที่สร้างสรรค์อย่างแท้จริงสำหรับคำถามนี้ที่นี่ นี่คือวิธีง่ายๆสำหรับผู้ที่เพิ่งเริ่มต้นด้วยอาร์เรย์ สามารถทำให้ทำงานได้จนถึงเบราว์เซอร์ที่เข้ากันได้กับ ECMAScript 3 หากต้องการ
รู้บางอย่างเกี่ยวกับการประกบกันก่อนเริ่มต้น
Mozilla Developer Network: Array.prototype.splice ()
.splice()
ครั้งแรกเข้าใจทั้งสองรูปแบบที่สำคัญของ
let a1 = [1,2,3,4],
a2 = [1,2];
วิธีที่ 1) ลบองค์ประกอบ x (deleteCount) โดยเริ่มจากดัชนีที่ต้องการ
let startIndex = 0,
deleteCount = 2;
a1.splice(startIndex, deleteCount);
วิธีที่ 2) ลบองค์ประกอบหลังจากดัชนีเริ่มต้นที่ต้องการไปยังจุดสิ้นสุดของอาร์เรย์
a1.splice(2);
การใช้.splice()
เป้าหมายสามารถแบ่งออกa1
เป็นอาร์เรย์หัวและหางโดยใช้หนึ่งในสองรูปแบบด้านบน
เมื่อใช้วิธี # 1 ค่าส่งคืนจะกลายเป็นส่วนหัวและa1
ส่วนท้าย
let head = a1.splice(startIndex, deleteCount);
ตอนนี้ในบัดดลให้ต่อหัวลำตัว ( a2
) และหางเข้าด้วยกัน
[].concat(head, a2, a1);
ดังนั้นการแก้ปัญหานี้จึงเหมือนโลกแห่งความจริงมากกว่าที่อื่น ๆ ที่นำเสนอจนถึงตอนนี้ นี่ไม่ใช่สิ่งที่คุณจะทำกับ Legos หรือ? ;-) นี่คือฟังก์ชั่นที่ทำโดยใช้วิธี # 2
function insertArray(target, body, startIndex)
{
let tail = target.splice(startIndex);
return [].concat(target, body, tail);
}
let newArray = insertArray([1, 2, 3, 4], ["a", "b"], 2);
สั้นกว่า:
function insertArray(target, body, startIndex)
{
return [].concat(target, body, target.splice(startIndex));
}
ปลอดภัยกว่า:
function insertArray(target, body, startIndex)
{
const ARRAY_START = 0,
ARRAY_END = target.length - 1,
ARRAY_NEG_END = -1,
START_INDEX_MAGNITUDE = Math.abs(startIndex);
if (startIndex === ARRAY_START) {
throw new Error("The value for startIndex cannot be zero (0).");
}
if (startIndex === ARRAY_END || startIndex === ARRAY_NEG_END) {
throw new Error("The startIndex cannot be equal to the last index in target, or -1.");
}
if (START_INDEX_MAGNITUDE >= ARRAY_END) {
throw new Error("The absolute value of startIndex must be less than the last index.");
}
return [].concat(target, body, target.splice(startIndex));
}
ข้อดีของโซลูชันนี้ ได้แก่ :
1) หลักฐานง่ายๆครอบงำโซลูชัน - เติมอาร์เรย์ว่าง
2) ระบบการตั้งชื่อศีรษะลำตัวและหางให้ความรู้สึกเป็นธรรมชาติ
3) ไม่มีการโทรซ้ำ .slice()
ซ้ำ ไม่มีการหั่นเลย
4) ไม่ .apply()
ไม่มี ไม่จำเป็นอย่างยิ่ง
5) หลีกเลี่ยงการผูกมัดวิธีการ
6) ทำงานใน ECMAScript 3 และ 5 เพียงแค่ใช้var
แทนlet
หรือconst
หรือ
** 7) ตรวจสอบให้แน่ใจว่าจะมีหัวและหางที่จะตบเข้ากับร่างกายซึ่งแตกต่างจากโซลูชันอื่น ๆ ที่นำเสนอ หากคุณกำลังเพิ่มอาร์เรย์ก่อนหรือหลังขอบเขตอย่างน้อยคุณควรใช้.concat()
!!!!
หมายเหตุ: การใช้ตัวดำเนินการการแพร่กระจาย...
ทำให้ทั้งหมดนี้สำเร็จได้ง่ายขึ้นมาก