繁体   English   中英

从数组中删除一系列元素

[英]Remove a range of elements from an array

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

 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"]

为什么会这样?

有没有更快更好的方法来做到这一点?

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

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

参数

start开始更改数组的索引(原点为 0)。 如果大于数组的长度,实际起始索引将设置为数组的长度。 如果为负数,将从数组末尾开始很多元素(原点为 1),如果绝对值大于数组的长度,则设置为 0。

deleteCount可选 一个整数,指示要删除的旧数组元素的数量。 如果 deleteCount 为 0,则不删除任何元素。 在这种情况下,您应该至少指定一个新元素。 如果 deleteCount 大于从 start 开始数组中剩余的元素数,则将删除数组末尾的所有元素。

解决方案:

你需要计算这两个索引之间的元素个数,所以使用b-a+1得到正确的计数。

演示:

这应该是你的代码:

 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);

这是使用过滤器的一种方法:

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:链接

发生这种情况是因为 array.splice() 采用第一个索引并且要删除的元素数不是最后一个索引尝试

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM