从数组中删除假值

3

我正在freeCodeCamp学习,目前正在学习基本算法。我正在做Falsy Bouncer练习,需要从数组中删除所有Falsy值。遗憾的是,这个任务只有高级答案,使用了filter()方法。我决定制作一个基本版本,但目前卡住了。

function bouncer(arr) { 

//*loops through array*    

for (let i = 0; i < arr.length; i++) {  

// *if there is a value that is falsy, delete that value from the array*    

if (arr[i] == 0 || arr[i] == NaN || arr[i] == null || arr[i] == false || arr[i] == "" || arr[i] == undefined) {        

delete arr[i];

     }    

   }    

return arr;

} 

console.log(bouncer([7, "ate", "", false, 9]));

返回结果为:

7,ate,,,9.

这个函数确实去掉了假值,但是我还剩下那三个点(,,,). 有没有办法让这个函数更正确地工作,并返回没有这些点的真值,同时不失去函数的简单性? 感谢您的帮助。


1
arr[i] == NaN 永远不会为 true - Sebastian Simon
5个回答

5

delete 只能用于对象。你需要使用 filter

const arr = [7, "ate", "", false, 9]

console.log(arr.filter(x => x))

filter 仅保留函数返回 true 的数组元素 - 这里使用 x => x,因为您只想要真值元素。


Boolean 可以用来替代 x => x - Sebastian Simon
@Xufox 是的,它可以 - 有什么优势吗? - ic3b3rg
不需要新的变量 x,也不需要创建新的函数。 - Sebastian Simon
1
我认为这是一个聪明的解决方案。 - Humayun Kabir

3

这样做就可以了

var m = arr.filter(Boolean);

2

如果您刚开始接触JavaScript并且需要让您的代码在其他情况下也能正常工作,您可以这样做:

删除delete arr[i];并将其替换为arr.splice(i,1); i--;

这将从第i个位置中移除项目,其中1表示从第i个位置移除1个项目。由于第i个位置的元素已被删除,并且有一个新元素在那里。我们需要从那里重新开始。所以我们需要添加i--。否则,在下一次迭代中,它将从下一个元素而不是第i个位置开始。

function bouncer(arr) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == 0 || Number.isNaN(arr[i]) || arr[i] == null || arr[i] == false || arr[i] == "" || arr[i] == undefined) {
            arr.splice(i, 1);
            i--;
        }
    }
    return arr;
}

console.log(bouncer([7, NaN, "ate", "", false, 9]));

非常感谢,我想使用splice,但似乎我缺少了i--,这给了我一个非常错误的答案。 - Mark Sheleg
还有一个问题,我该如何处理NaN属性?当我将[false,null,0,NaN,undefined,“”]作为参数插入时,它返回NaN,而应该返回[]。 - Mark Sheleg
@MarkSheleg 你可以使用 Number.isNaN(arr[i]) 来代替 arr[i] == NaN。我已经更新了代码。 - Sandeepa

1
< p > Delete 只能在 Object 上使用。

如果您愿意使用简单的for循环,可以像这样轻松完成它

function bouncer(arr) {
let op =[];
for (let i = 0; i < arr.length; i++) {
  if(arr[i]){
    op.push(arr[i]);
  }
}
return op;
}

console.log(bouncer([7, "ate", "", false, 9]));


1
为什么你要这样做而不是使用.filter呢? - ic3b3rg
@ic3b3rg 很遗憾,这个任务只有使用filter()方法的高级答案。我决定做一个基础版,但目前卡住了。他想理解替代方案,我很欣赏他的态度。 - Code Maniac

0

使用map方法和Boolean()进行比较。

const bouncer = arr => {

    let newArr = [];

    arr.map(e => {
        if (Boolean(e) == true) {
            newArr.push(e)
        }
    });


    return newArr;
}

1
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Mark Rotteveel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接