从 javascript 数组中删除所有虚假值,包括 NaN 但不包括 0 和空字符串

Removing all falsy values from a javascript array, including NaN but excluding 0 and empty strings

我有以下数组:

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

我想 filter() 输出 所有 falsyexcept 对于 ''0.

我知道有用shorthand:

return values.filter(Boolean)

但这会删除所有 falsy,包括 ''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

尝试:

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

NaN 不等于自身(即 NaN === NaN 计算为 false),因此将它与 indexOf 一起使用会失败。另一种方法也能更好地传达您的目标(“filter() out all the falsy values except for '' and 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);

你也可以考虑使用 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);