มีคำตอบที่ยอดเยี่ยมมากมายในกระทู้นี้แล้ว อย่างไรก็ตามฉันต้องการแบ่งปันประสบการณ์ของฉันเมื่อฉันพยายามที่จะแก้ปัญหา "ลบองค์ประกอบที่ n จากอาร์เรย์" ในบริบท ES5
อาร์เรย์ JavaScript มีวิธีการที่แตกต่างกันในการเพิ่ม / ลบองค์ประกอบตั้งแต่เริ่มต้นหรือสิ้นสุด เหล่านี้คือ:
arr.push(ele) - To add element(s) at the end of the array
arr.unshift(ele) - To add element(s) at the beginning of the array
arr.pop() - To remove last element from the array
arr.shift() - To remove first element from the array
เป็นหลักไม่มีวิธีการข้างต้นสามารถใช้โดยตรงเพื่อลบองค์ประกอบที่ n จากอาร์เรย์
ความจริงที่น่าสังเกตคือนี่เป็นสิ่งที่ตรงกันข้ามกับการใช้ตัวจาวา iterator ซึ่งเป็นไปได้ที่จะลบองค์ประกอบที่ n สำหรับคอลเลกชันในขณะที่วนซ้ำ
สิ่งนี้จะทำให้เรามีวิธีการเรียงลำดับเดียวที่Array.splice
จะทำการกำจัดองค์ประกอบที่ n (มีสิ่งอื่น ๆ ที่คุณสามารถทำได้ด้วยวิธีการเหล่านี้เช่นกัน แต่ในบริบทของคำถามนี้ฉันมุ่งเน้นไปที่การกำจัดองค์ประกอบ):
Array.splice(index,1) - removes the element at the index
นี่คือรหัสที่คัดลอกมาจากคำตอบดั้งเดิม (พร้อมความคิดเห็น):
var arr = ["one", "two", "three", "four"];
var i = arr.length; //initialize counter to array length
while (i--) //decrement counter else it would run into IndexOutBounds exception
{
if (arr[i] === "four" || arr[i] === "two") {
//splice modifies the original array
arr.splice(i, 1); //never runs into IndexOutBounds exception
console.log("Element removed. arr: ");
} else {
console.log("Element not removed. arr: ");
}
console.log(arr);
}
Array.slice
อีกวิธีที่น่าสังเกตคือ อย่างไรก็ตามประเภทการคืนของวิธีนี้คือองค์ประกอบที่ถูกลบออก นอกจากนี้ยังไม่ได้ปรับเปลี่ยนอาร์เรย์เดิม แก้ไขข้อมูลโค้ดดังต่อไปนี้:
var arr = ["one", "two", "three", "four"];
var i = arr.length; //initialize counter to array length
while (i--) //decrement counter
{
if (arr[i] === "four" || arr[i] === "two") {
console.log("Element removed. arr: ");
console.log(arr.slice(i, i + 1));
console.log("Original array: ");
console.log(arr);
}
}
ต้องบอกว่าเรายังคงสามารถใช้Array.slice
เพื่อลบองค์ประกอบที่ n ดังที่แสดงด้านล่าง อย่างไรก็ตามมันเป็นรหัสที่มากขึ้น (ไม่มีประสิทธิภาพ)
var arr = ["one", "two", "three", "four"];
var i = arr.length; //initialize counter to array length
while (i--) //decrement counter
{
if (arr[i] === "four" || arr[i] === "two") {
console.log("Array after removal of ith element: ");
arr = arr.slice(0, i).concat(arr.slice(i + 1));
console.log(arr);
}
}
Array.slice
วิธีเป็นสิ่งสำคัญมากเพื่อให้บรรลุเปลี่ยนไม่ได้ในการเขียนโปรแกรมการทำงานàลา Redux