【问题标题】:How to filter out non-integer and negative numbers from an array [closed]如何从数组中过滤掉非整数和负数[关闭]
【发布时间】:2019-08-23 11:23:17
【问题描述】:

我做了一个函数,只保留数组中的正整数,我想知道是否有更好的方法来编写它,谢谢

var arr = [2, 5, 5.5, 3, 6.8, 0, -5];

const filtrate = (el) => {
  return Number.isInteger(el) && el > 0;
}

console.log(arr.filter(filtrate));

【问题讨论】:

  • 对我来说看起来很完美(不过记得为过时的浏览器填充 isInteger
  • 我不知道它是否更好,但如果你可以使用 es6 语法,我猜你可以让它更短,你可以检查 typeof 关键字。
  • @Kevin.a 虽然,typeof 不会验证参数是否为整数,只是验证它是数字,因此需要额外检查

标签: javascript arrays function filter


【解决方案1】:

另一种选择是使用parseInt() 将数字解析为整数并将其与原始值进行比较。

这将过滤掉浮点数,因为浮点数上的parseInt 将删除数字的小数部分。也适用于旧版浏览器:

var arr = [2, 5, 5.5, 3, 6.8, 0 , -5];

function filtrate(el) {
  return (parseInt(el, 10) === el) && el > 0;
}

console.log(arr.filter(filtrate));

【讨论】:

  • 记得使用基数,不过 (parseInt()): (parseInt(el, 10) === el); base-2、base-8 或 base-16 的可能性可能有限,但(通常)比抱歉更安全。
  • @DavidThomas 正确!
【解决方案2】:

取决于你所说的“更好”——更清晰还是更快?

您可能希望在检查它是否为整数之前检查 > 0,因为转换为整数(尤其是使用 ParseInt)可能会更慢。

尝试 (el % 1 == 0) 进行整数检查可能会更快。

var arr = [2, 5, 5.5, 3, 6.8, 0, -5];

function filtrate(el) {
  return el > 0 && el % 1 == 0;
}

console.log(arr.filter(filtrate));

您的原始解决方案看起来确实合理 - 这完全取决于您是否期望主要是整数,以及数据集的大小。并且可能在您希望在哪个浏览器上运行。

【讨论】:

    【解决方案3】:

    使用 ES6 的更短方式:

    const arr = [2, 5, 5.5, 3, 6.8, 0, -5]; //or use let instead of var
    const filtrate = el => Number.isInteger(el) && el > 0;
    console.log(arr.filter(filtrate));

    【讨论】:

      【解决方案4】:

      使用regex

        const arr = [2, 1e3, 1.2e4, -1.2e4, 5, 5.5, 3, 6.8, 0, -5, { id: 1}, [1, 2, 4], -1.1, -33.45];
        
        const positiveInt = /^[1-9]\d*$/;
        const filtrate = (el) => {
          return typeof el === 'number' ? positiveInt.test(`${el}`) : false;
        };
        
        console.log(arr.filter(filtrate));

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 2018-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        相关资源
        最近更新 更多