Có rất nhiều câu trả lời tuyệt vời về chủ đề này rồi. Tuy nhiên tôi muốn chia sẻ kinh nghiệm của mình khi tôi cố gắng giải quyết "loại bỏ phần tử thứ n khỏi mảng" trong ngữ cảnh ES5.
Mảng JavaScript có các phương thức khác nhau để thêm / xóa các phần tử từ đầu hoặc cuối. Đó là:
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
Về cơ bản, không có phương pháp nào ở trên có thể được sử dụng trực tiếp để loại bỏ phần tử thứ n khỏi mảng.
Một thực tế đáng chú ý là điều này trái ngược với java iterator sử dụng mà có thể loại bỏ phần tử thứ n cho một bộ sưu tập trong khi lặp.
Điều này về cơ bản khiến chúng ta chỉ có một phương thức mảng Array.splice
để thực hiện loại bỏ phần tử thứ n (có những điều khác bạn có thể làm với các phương thức này, nhưng trong bối cảnh của câu hỏi này, tôi đang tập trung vào việc loại bỏ các phần tử):
Array.splice(index,1) - removes the element at the index
Đây là mã được sao chép từ câu trả lời ban đầu (có ý kiến):
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);
}
Một phương pháp đáng chú ý khác là Array.slice
. Tuy nhiên, kiểu trả về của phương thức này là các phần tử bị loại bỏ. Ngoài ra, điều này không sửa đổi mảng ban đầu. Đoạn mã được sửa đổi như sau:
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);
}
}
Tuy nhiên, chúng ta vẫn có thể sử dụng Array.slice
để loại bỏ phần tử thứ n như hình bên dưới. Tuy nhiên, nó là nhiều mã hơn (do đó không hiệu quả)
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);
}
}
Các Array.slice
phương pháp là vô cùng quan trọng để đạt được tính bất biến trong lập trình chức năng à la Redux