Javascript 我的函数没有';t删除“;假;将其转换为布尔值后

Javascript 我的函数没有';t删除“;假;将其转换为布尔值后,javascript,arrays,boolean,Javascript,Arrays,Boolean,我试图创建一个函数,当转换为布尔值时,该函数将删除所有“false”值,但由于某些原因,“false”项不会从数组中删除 功能弹跳器(arr){ 让y=[] 对于(让我考虑arr){ if(布尔值(i)=false){ arr.拼接(arr.indexOf(i),1) } } 控制台日志(arr) } 保镖([7,“吃了”,错了,9])迭代器(由为..of调用)是惰性的。它们不会创建一个包含所有项的集合,以便在开始时进行迭代。相反,在每次迭代开始时,它们增加要检查的索引,并在数组中查找该索引

我试图创建一个函数,当转换为布尔值时,该函数将删除所有“false”值,但由于某些原因,“false”项不会从数组中删除

功能弹跳器(arr){
让y=[]
对于(让我考虑arr){
if(布尔值(i)=false){
arr.拼接(arr.indexOf(i),1)
}
}
控制台日志(arr)
}
保镖([7,“吃了”,错了,9])迭代器(由
为..of
调用)是惰性的。它们不会创建一个包含所有项的集合,以便在开始时进行迭代。相反,在每次迭代开始时,它们增加要检查的索引,并在数组中查找该索引

在这种情况下,索引2上的
'
为假,将通过
拼接
删除。拼接后,阵列现在是:

[7, 'ate', false, 9]
然后,迭代器继续执行索引3,并检查
9
false
不会被迭代

改用
.filter

const bouncer=arr=>arr.filter(布尔值);
log(bouncer([7,“ate”,false,9])迭代器(由
为..of
调用)是惰性的。它们不会创建一个包含所有项的集合,以便在开始时进行迭代。相反,在每次迭代开始时,它们增加要检查的索引,并在数组中查找该索引

在这种情况下,索引2上的
'
为假,将通过
拼接
删除。拼接后,阵列现在是:

[7, 'ate', false, 9]
然后,迭代器继续执行索引3,并检查
9
false
不会被迭代

改用
.filter

const bouncer=arr=>arr.filter(布尔值);

log(bouncer([7,“ate”,false,9])您需要从数组的末尾循环,因为您可以使用
拼接
更改元素的索引

功能弹跳器(arr){
设i=arr.长度;
而(我--){
若(!arr[i])arr.拼接(i,1);
}
控制台日志(arr)
}

保镖([7,“吃了”,错了,9])您需要从数组的末尾循环,因为您可以使用
拼接
更改元素的索引

功能弹跳器(arr){
设i=arr.长度;
而(我--){
若(!arr[i])arr.拼接(i,1);
}
控制台日志(arr)
}
保镖([7,“吃了”,错了,9])

indexOf()方法返回可在数组中找到给定元素的第一个索引

只需使用,它很清楚。

根据MDN

indexOf()方法返回可在数组中找到给定元素的第一个索引


只需使用,很清楚。

我会使用
.filter()
来避免O(n2)算法:

let bouncer = (arr) =>
  arr.filter((e) => Boolean(e));
调用时,必须将返回值分配给目标数组:

someArray = bouncer(someArray);
创建一个新数组不是没有成本的,但是在一个有许多错误值的大型输入数组上反复使用
.splice()
会更糟糕

还要注意的是,您实际上并不需要
Boolean()
;使用
隐式执行布尔类型转换:

let bouncer = (arr) =>
  arr.filter((e) => !!e);

我会使用
.filter()
来避免O(n2)算法:

let bouncer = (arr) =>
  arr.filter((e) => Boolean(e));
调用时,必须将返回值分配给目标数组:

someArray = bouncer(someArray);
创建一个新数组不是没有成本的,但是在一个有许多错误值的大型输入数组上反复使用
.splice()
会更糟糕

还要注意的是,您实际上并不需要
Boolean()
;使用
隐式执行布尔类型转换:

let bouncer = (arr) =>
  arr.filter((e) => !!e);

在循环数组时编辑数组,这会导致意外行为:

更新代码如下:

功能弹跳器(arr){
让y=[]
对于(让我考虑arr){
if(布尔值(i)==false){
y、 推送(一)
}
}
为了(让我来谈谈y){
arr.拼接(arr.indexOf(i),1)
}
控制台日志(arr)
}

保镖([7,“吃了”,错了,9])在循环数组时编辑数组,这会导致意外行为:

更新代码如下:

功能弹跳器(arr){
让y=[]
对于(让我考虑arr){
if(布尔值(i)==false){
y、 推送(一)
}
}
为了(让我来谈谈y){
arr.拼接(arr.indexOf(i),1)
}
控制台日志(arr)
}
保镖([7,“吃了”,错了,9])
功能弹跳器(arr){
让y=[]
对于(让我考虑arr){
if(typeof i=='boolean'&&boolean(i)==false){
arr.拼接(arr.indexOf(i),1)
}
}
控制台日志(arr)
}
保镖([7,“吃了”,错了,9])
功能弹跳器(arr){
让y=[]
对于(让我考虑arr){
if(typeof i=='boolean'&&boolean(i)==false){
arr.拼接(arr.indexOf(i),1)
}
}
控制台日志(arr)
}

保镖([7,“吃了”,错了,9])当你在循环的中间修改数组时,你会在迭代过程中跳过一个元素。检查你在循环中间修改数组时,你会在迭代过程中跳过一个元素。看看这不是OP试图做的事情。原始文件中对
Boolean()
的显式调用会将数组中的值转换为布尔值,因此也会删除空字符串。现在检查一下,我认为这应该是可行的。OP不想这样做。原始文件中对
Boolean()
的显式调用会将数组中的值转换为布尔值,因此也会删除空字符串。现在检查一下,我认为这应该是可行的。这不是问题的目的,也不能解决根本问题。请尝试在一行中包含两个
false
值的数组。这不是问题所在,也不能解决根本问题。尝试在一行中包含两个
false
值的数组。
这是一个很好的技巧。我还将添加
arr.f