在此线程上已经有很多精彩的答案。但是,当我尝试解决ES5上下文中的“从数组中删除第n个元素”时,我想分享自己的经验。
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个元素。
值得注意的事实是,这与java迭代器的使用相反,后者可以在迭代时删除集合的第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
方法对于实现功能编程中的不变性极为重要