3

我有以下数组:

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

我想filter()排除and之外的所有falsy值。''0

我知道有一个有用的速记:

return values.filter(Boolean)

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

4

3 回答 3

5

尝试:

values.filter(value => value || value === '' || value === 0);
于 2020-09-30T13:29:48.257 回答
5

NaN不等于自身(即NaN === NaN评估为假),因此使用它indexOf失败。也可以更好地传达您的目标的另一种方法(“过滤()除''和 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);

于 2020-09-30T13:30:03.617 回答
1

您还可以考虑使用Set,因为您可以检查集合是否包含NaN并且时间复杂度为hasO(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);

于 2020-09-30T13:40:21.417 回答