从数组中删除一定范围的元素

新手上路,请多包涵

我想从 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"]

为什么会这样?

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

原文由 Run 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 387
2 个回答

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

Array.prototype.splice() MDN Reference 可以看出:

参数

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

原文由 cнŝdk 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是使用过滤器执行此操作的一种方法:

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

原文由 Dream_Cap 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题