从数组中删除一段元素

7

我想从数组中删除一系列元素:

var fruits = ["Banana", "Orange1", "Apple", "Banana", "Orange", "Banana", "Orange", "Mango", "Bananax", "Orangex"];
var a = fruits.indexOf("Apple");
var b = fruits.indexOf("Mango");

var removedCars = fruits.splice(a, b);

console.log(fruits);

所以我期望:

["Banana", "Orange1", "Bananax", "Orangex"]

但结果是:
["Banana", "Orange1", "Orangex"]

为什么会出现这种情况?

有没有更快更好的方法来做这件事?


5
您没有正确使用splice函数。第一个参数定义了要删除或添加的元素数量,而第二个参数是起始位置索引。 - Leth
7
array.splice(start, deleteCount) 这个方法的第二个参数并不是一个索引。 - Cerbrus
3个回答

16
Array.prototype.splice() 的第二个参数是要删除的元素数量,而不是结束索引。

你可以从 Array.prototype.splice() MDN 参考文档 中看到:

参数 start:更改数组的起始索引(从0开始)。如果大于数组长度,则实际起始索引将设置为数组长度。如果为负数,则将从数组末尾开始该数量的元素(从1开始),如果绝对值大于数组长度,则设置为0。 deleteCount:可选参数,表示要删除的旧数组元素的数量。如果deleteCount为0,则不删除任何元素。在这种情况下,您应该至少指定一个新元素。如果deleteCount大于从start开始剩余的元素数量,则将删除整个数组到结尾的所有元素。 解决方案: 您需要计算这两个索引之间的元素数量,因此使用(b-a)+1来获取正确的计数。 演示: 这是您的代码,使用splice的正确用法:

var fruits = ["Banana", "Orange1", "Apple", "Banana", "Orange", "Banana", "Orange", "Mango", "Bananax", "Orangex"];
var a = fruits.indexOf("Apple");
var b = fruits.indexOf("Mango");

var removedFruits = fruits.splice(a, (b - a) + 1);

console.log(fruits);


3

以下是使用 filter 的一种方法:

var fruits = ["Banana", "Orange1", "Apple", "Banana", "Orange", "Banana", "Orange", "Mango", "Bananax", "Orangex"];
var a = fruits.indexOf("Apple");
var b = fruits.indexOf("Mango");

//returns items not equal to a or b
function fruitfilter(item, index){
return index !== a && index !== b;
}

//apply the filter to the array, returns a new array
var newfruits = fruits.filter(fruitfilter);
 //log the new fruits
console.log(newfruits);

这里是一个JSFiddle: 链接


0
这是因为 array.splice() 方法需要传入要删除的第一个元素的索引和要删除的元素数量,而不是最后一个元素的索引。 你可以尝试这样做。
fruits.splice(a, b - a + 1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接