Javascript 我的函数没有';t删除“;假;将其转换为布尔值后
我试图创建一个函数,当转换为布尔值时,该函数将删除所有“false”值,但由于某些原因,“false”项不会从数组中删除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调用)是惰性的。它们不会创建一个包含所有项的集合,以便在开始时进行迭代。相反,在每次迭代开始时,它们增加要检查的索引,并在数组中查找该索引
功能弹跳器(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])根据MDN编码>
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