首页 > 解决方案 > 我的函数在将其转换为布尔值后不会删除“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]);

标签: javascriptarraysboolean

解决方案


迭代器(由 调用for..of)是惰性的。他们不会在开始时创建要迭代的所有项目的集合。相反,在每次迭代开始时,它们递增要检查的索引,并在数组上查找该索引。

在这种情况下,在索引 2 上,''错误的 被 删除splice。拼接后的数组现在是:

[7, 'ate', false, 9]

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

改用.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]));


推荐阅读