【问题标题】:Why does my function filter out zeroes as well as strings?为什么我的函数会过滤掉零和字符串?
【发布时间】:2020-06-24 02:51:12
【问题描述】:

我正在尝试过滤掉数组中的所有字符串,但我这样做的方式也是过滤掉 0。我使用 filter() 和 for 循环/删除来尝试这个,但每次都会删除零时间。

这是我尝试使用 for 循环进行过滤(filter() 用于删除空数组元素):

function filterArray(arr) {
    let newArr = arr;
    for (let i = 0; i < newArr.length; i++) {
        if (typeof newArr[i] === "string"){
                delete newArr[i];
        }
    }
    newArr = newArr.filter(Boolean);
    return newArr;
}

不工作的测试用例是(所有其他测试用例都正常工作):

filterArray([1, "a", "b", 0, 15]);

这应该返回 [1, 0, 15] 但它返回的是 [1,15]。另外,当我测试console.log(typeof arr[3]); 时,它返回“数字”,所以我认为根据我的 if 语句它不会被删除。

感谢任何帮助/澄清!

【问题讨论】:

    标签: javascript arrays string filter


    【解决方案1】:

    newArr.filter(Boolean) 使用布尔函数将每个值转换为布尔值,然后过滤掉任何错误的值。

    Boolean(1)
    > true
    Boolean(0)
    > false
    Boolean(15)
    > true
    

    这样你就剩下[1, 15]了。

    一种更简单的方法...

    function filterArray(arr) {
        return arr.filter(x => typeof(x) !== 'string');
    }
    
    filterArray([1, "a", "b", 0, 15]);
    > [1, 0, 15]
    

    作为旁注 - (newArr = arr;) 不会复制原始数组。

    【讨论】:

    • 谢谢!我首先尝试了 filter() 方式,但我一定搞砸了。非常感谢。
    • 另外,感谢您的旁注。我将使用 slice 来复制数组。
    【解决方案2】:

    你也可以通过正则匹配数字。

    var arr = [1, "a", "b", 0, 15];
    var str = arr.join(" ");
    console.log(str);
    console.log(str.match(/\d+/g));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 2018-09-28
      相关资源
      最近更新 更多