简体   繁体   中英

Remove a range of elements from an array

I want to remove a range of elements from an 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);

So I am expecting:

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

But the result is:

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

Why is this happening?

Are there any faster and better ways of doing this?

The second param of Array.prototype.splice() method is the number of elements to be removed and not an ending index.

You can see from the Array.prototype.splice() MDN Reference that:

Parameters

start Index at which to start changing the array (with origin 0). If greater than the length of the array, actual starting index will be set to the length of the array. If negative, will begin that many elements from the end of the array (with origin 1) and will be set to 0 if absolute value is greater than the length of the array.

deleteCount Optional An integer indicating the number of old array elements to remove. If deleteCount is 0, no elements are removed. In this case, you should specify at least one new element. If deleteCount is greater than the number of elements left in the array starting at start, then all of the elements through the end of the array will be deleted.

Solution:

You need to calculate the number of elements between these two indexes, so use b-a+1 to get the correct count.

Demo:

This is how should be your code:

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

Here's one way to do it with 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);

Here's a jsfiddle: link

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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