我想从数组中删除一系列元素:
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"]
为什么会这样?
有没有更快更好的方法呢?
答案 0 :(得分:5)
Array.prototype.splice() 方法的第二个参数是要删除的元素数,而不是结束索引。
您可以从Array.prototype.splice() MDN Reference看到:
<强>参数强>
start
开始更改数组的索引(原点为0)。如果 大于数组的长度,实际的起始索引将是 设置为数组的长度。如果否定,将开始那么多 数组末尾的元素(原点1)将被设置为 如果绝对值大于数组的长度,则为0。
deleteCount
可选一个整数,表示旧数组的数量 要删除的元素。如果deleteCount为0,则不删除任何元素。在 在这种情况下,您应该至少指定一个新元素。如果是deleteCount 大于数组中剩余的元素数量 开始,然后通过数组末尾的所有元素将是 删除。
<强>解决方案:强>
您需要计算这两个索引之间的元素数量,因此请使用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);
答案 1 :(得分:2)
以下是使用过滤器执行此操作的一种方法:
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);
这是一个小伙伴:link
答案 2 :(得分:0)
这是因为array.splice()获取第一个索引和要删除的元素数而不是最后一个索引 试试那个
fruits.splice(a, b - a + 1);