我的函数在将"false"转换为布尔值后不会删除它



我试图创建一个函数,该函数将删除所有";false";当转换为布尔值但由于某种原因;false";项未从数组中删除。

function bouncer(arr) {
let y = []
for (let i of arr) {
if (Boolean(i) == false) {
arr.splice(arr.indexOf(i), 1)
}
}
console.log(arr)
}
bouncer([7, "ate", "", false, 9]);

迭代程序(由for..of调用(是懒惰的。它们不会创建一个所有项目的集合,以便在开始时进行迭代。相反,在每次迭代开始时,他们递增要检查的索引,并在数组中查找该索引。

在这种情况下,在索引2上,作为伪的''splice一起被移除。拼接后,阵列现在是:

[7, 'ate', false, 9]

然后,迭代器继续到索引3,并检查9false从不重复。

改为使用.filter

const bouncer = arr => arr.filter(Boolean);
console.log(bouncer([7, "ate", "", false, 9]));

如果在适当的位置突变数组,则向后迭代:

const bouncer = (arr) => {
for (let i = arr.length - 1; i >= 0; i--) {
if (!arr[i]) {
arr.splice(i, 1);
}
}
return arr;
};
console.log(bouncer([7, "ate", "", false, 9]));

您需要从数组的末尾开始循环,因为您使用splice来更改元素的索引。

function bouncer(arr) {
let i = arr.length;
while (i--) {
if (!arr[i]) arr.splice(i, 1);
}
console.log(arr)
}
bouncer([7, "ate", "", false, 9]);

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

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

当你调用它时,你必须将返回值分配给目标数组:

someArray = bouncer(someArray);

创建一个新数组并非没有成本,但在具有许多伪值的大型输入数组上反复使用.splice()会更糟。

还要注意,您并不真正需要Boolean();使用!!隐式执行布尔类型强制转换:

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

根据的MDN索引

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

只需使用Filter,就可以了。

function bouncer(arr) {
let y = []
for (let i of arr) {
if (typeof i === 'boolean' && Boolean(i) == false) {
arr.splice(arr.indexOf(i), 1)
}
}
console.log(arr)
}
bouncer([7, "ate", "", false, 9]);

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

更新代码如下:

function bouncer(arr) {
let y = []
for (let i of arr) {
if (Boolean(i) === false) {
y.push(i)
}
}
for (let i of y) {
arr.splice(arr.indexOf(i), 1)
}
console.log(arr)
}
bouncer([7, "ate", "", false, 9]);

或者最好试试下面es6的过滤器:

const data = [7, "ate", "", false, 9]
const filtered = arr => arr.filter(Boolean)
console.log(filtered(data))

最新更新