【问题标题】:check for falsy values in javascript [duplicate]检查javascript中的虚假值[重复]
【发布时间】:2019-11-26 15:25:41
【问题描述】:

我想从数组中删除具有虚假值的元素,但我的代码不是这样的。我想知道为什么我的代码不起作用。这是代码

let g= [7, null, "ate", "", false, true, 9];

g.forEach((cur,ind,arr) => {
    if (!cur) {
        arr.splice(ind,1);
    }
});

console.log(g);

这是输出

[7, "ate", false, true, 9]

【问题讨论】:

  • 在迭代时修改数组是……很奇怪。只需g = g.filter(i => i) 即可。
  • 您更改了数组,但 forEach 仍然知道旧值/索引。

标签: javascript


【解决方案1】:

forEach 函数不会检测是否删除元素,所以当你修改数组时,它会跳过元素。做你想做的最好的方法是:

g.filter(e => e);

【讨论】:

    【解决方案2】:

    你可以使用filter

    filter() 方法创建一个包含所有通过的元素的新数组 由提供的函数实现的测试。

    const result = g.filter(val => val);
    //or if you want to be superfluous like me
    const result = g.filter(val => !!val);
    // output [7, "ate", true, 9]
    

    【讨论】:

    • !!valval.
    • 是的,但我隐约记得在某处使用 !!如果不是,是否会将每个值更改为布尔值?
    • 是的,它确实将其更改为布尔值,但这是多余的。 Javascript 无论如何都会在布尔上下文中执行此操作(即,当它需要 truthyfalsey 值时)。
    • filter() 函数的上下文中是多余的,因为它基于真实性返回。在其他方法中,情况可能并非如此,那就是双 bang (!!) 很有帮助。
    • 啊是的,当然
    【解决方案3】:
    g.filter(Boolean);
    

    应该足以解决您的问题。

    如果你用任何值调用Boolean的构造函数,它会将它们转换为布尔值,因此过滤器将接受所有真实值。

    使用.filter 将从您的原始数组g 创建一个新数组,但只保留真实值。

    其实是我目前找到的比较简洁的方法,但是完全等价于下面的方法。

    g.filter(el => el);
    

    因为表达式会将元素隐式转换为布尔值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 2012-06-16
      • 2021-04-20
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多