从JavaScript数组中删除所有“假值”,包括NaN但不包括0和空字符串。

3

我有以下数组:

const values = ['', 0, 'one', NaN, 1, 'two', 2, null, 'three', undefined, 3, false];

我想使用filter()方法过滤掉所有falsy值,除了''0

我了解这里有一个有用的简写:

return values.filter(Boolean)

但这么做会把所有“假”值都排除,包括''和0。
我尝试了以下代码:
return values.filter(value => [NaN, null, undefined, false].indexOf(value) < 0);

这几乎正确……但是它没有删除NaN

const values = ['', 0, 'one', NaN, 1, 'two', 2, null, 'three', undefined, 3, false];

const filteredValues = values.filter(value => [NaN, null, undefined, false].indexOf(value) < 0);

console.log(filteredValues);

有没有一种方法可以实现与最后一个示例相同的结果,但也删除NaN


1
在你的过滤器末尾添加 && !isNaN(value) - Heretic Monkey
只需添加一个 if ( ... ) 来测试 value 是否为假值,以测试 ""0 - Andreas
3个回答

5

NaN 不等于它本身(即 NaN === NaN 的结果为 false),因此在使用 indexOf 时会失败。另一种更好地传达你的目标(“过滤掉所有的 falsy 值,除了 '' 和 0”)的方法是:

const values = ['', 0, 'one', NaN, 1, 'two', 2, null, 'three', undefined, 3, false];
const filteredValues = values.filter(value => value || value === '' || value === 0);
console.log(filteredValues);


5

尝试:

values.filter(value => value || value === '' || value === 0);

1
你也可以考虑使用Set,因为你可以检查一个集合是否包含NaN,并且has的时间复杂度为O(1),而不是O(n),其中n是需要检查的项目数量:

const values = ['', 0, 'one', NaN, 1, 'two', 2, null, 'three', undefined, 3, false];
const notAllowed = new Set([NaN, null, undefined, false]);
const result = values.filter(val => !notAllowed.has(val));
console.log(result);


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