在JavaScript中,从数组中移除未知索引项的更好方法



我有一个数组,它在随机索引中有零。给定的不同数组的索引是未知的。我使用下面的for循环来查找和移除零,所以得到的数组是没有零的同一个数组。

for (let i=0; i< arr.length; i++){
if(arr[i] === 0){
itemIndex = arr.indexOf(arr[i]);
arr.splice(itemIndex, 1); //removes the zero at the index
i = 0; //resets the i to zero so that every item in the array is searched even after it is altered.
}
}

正如你所看到的;i〃;到零,这样我就可以再次遍历数组,因为它会被更改,零的索引也会更改。我想知道是否有更好的方法?我有一种感觉,这可以编码得更好。

您只需要将i递减1。此外,当您已经拥有索引时,不需要使用indexOf

for (let i=0; i< arr.length; i++){
if(arr[i] === 0){
arr.splice(i, 1); //removes the zero at the index
i--;
}
}

向后循环也解决了这个问题,而不需要额外的计数器操作,因为只有已经检查过的元素才会被移位。

当然,使用Array#filter要容易得多。

arr = arr.filter(x => x !== 0);

这里有几个选项。。。

  1. 保留for循环:可以减少i而不是i = 0(即用i--替换i = 0(
  2. 用过滤器替换循环:arr = arr.filter(element => element !== 0)

两者都会按照您的意愿在适当的位置修改数组。如果arr被初始化为常量,则第二个选项将不起作用。如果是这种情况,您必须使用选项1,或者将筛选结果分配给一个新数组,并在筛选后使用它来代替原始数组。

第二个选项稍微干净一些,但第一个选项是对现有代码进行一个小的更改,使其能够按预期工作。

您可以向下计数(即for (let i=arr.length-1; i>=0; i--),这样您尚未检查的元素的索引就不会改变。

let result = arr.filter(e => e!==0)

或者,如果您想坚持for循环实现:

填充一个新的数组,而不是改变你正在循环的数组:

let result = []
for(let e of arr) {
if(e!==0) result.push(e)
}

这是我从这样的数组中删除项的首选方法。

const newArray = array.filter(item => ele !== 0) 

最新更新