【问题标题】:How to remove different types of empty values (elements) from JS array如何从 JS 数组中删除不同类型的空值(元素)
【发布时间】:2020-05-14 14:32:42
【问题描述】:

有一个数组

const arr = [1, 'abc', [], ['John'], {}, {name: 'Smith'}, null, 0];

如何获取没有空值的新数组? (空数组和空对象也算空值)。

我的变种似乎有点硬编码:

const newArr = arr.filter(elem => 
            (elem && Object.keys(elem).length !== 0) 
            || (typeof(elem) == 'number' && elem !== 0));

是否可以编写更少或更简单的条件?

【问题讨论】:

  • 这能回答你的问题吗? Remove empty elements from an array in Javascript大概这个问题有类似的解决方案,我去看看。
  • != null,但它接受所有虚假值,例如 false 和 {}
  • 如果您使用的是 lodash 库,那么已经有一个实用程序 isEmpty 用于相同的。

标签: javascript arrays filter is-empty


【解决方案1】:

如果你有特定的变种,你可以尝试

const emptyVariants = ['', 0, null,] // all expected variants
const newArr = arr.filter(elem => !emptyVariants.includes(elem);

您可以尝试的另一种方法是使用!=,但它采用所有虚假值

const newArr = arr.filter(elem => (elem != null));

有关更多信息,请参阅 != 和 == 运算符 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators

【讨论】:

  • 只有emptyVariants[1] 包含该特定的空对象,很可能同一对象不会出现在其他任何地方。还检测到null 似乎失败了......
【解决方案2】:

对于 falsy 值、空对象和数组,您必须使用这部分:

elem && Object.keys(elem).length !== 0

但是你可以像这样最小化它:

elem && Object.keys(elem).length

length > 0 的任何值都将返回 truthy。

此外,您可以最小化数字逻辑,例如:

arr.filter(elem => Number(elem));

所以,最终版本会是这样的:

const arr = [1, 'abc', [], ['John'], {}, {name: 'Smith'}, null, 0];
const newArr = arr.filter(a => (a && Object.keys(a).length) || Number(a));
console.log(newArr)

【讨论】:

  • 谢谢,它确实有效。最小化的建议是非常合理的
  • 我相信 0 应该作为“非空”值包含在结果中。上面的代码排除了这一点。
【解决方案3】:

这个怎么样?

 arr.filter(i => (typeof i === 'number') || (i && i.length>0) || (( i && Object.keys(i).length)>0) || (i===0));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-18
    • 2019-11-28
    • 1970-01-01
    • 2019-04-09
    • 2023-03-04
    • 2019-08-23
    • 2019-05-29
    • 1970-01-01
    相关资源
    最近更新 更多