将“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]
[7, 'ate', false, 9]

然后,迭代器继续到索引 3,并检查9。将false永远不会遍历。

使用.filter来代替:

如果必须就地改变数组,请向后迭代:

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


以上是将“false”转换为布尔值后,我的函数不会删除它的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>