【问题标题】:Array.filter numbers plus zeroArray.filter 数字加零
【发布时间】:2015-10-01 16:37:24
【问题描述】:

我有一个简单的问题,但我被困住了:我想转换一个整数和字符串列表并返回一个过滤掉字符串的新列表:

示例:([99,5,'love','hate']) == [99,5]

我使用了.filter,但也过滤了零。最好的选择是什么?

function filter(l) {
  var arr = l.filter(Number);
  return arr;
}

【问题讨论】:

标签: javascript arrays filter numbers


【解决方案1】:

您可以将.filter() 与您自己的函数一起使用:

function filter(l) {
  var arr = l.filter(function(n) {
    return typeof n === "number";
  });
  return arr;
}

请注意,当您使用 Number 构造函数时,您将包含数字以及任何可以成功转换为数字的值。包括这样的东西有点棘手,因为 Number 构造函数 always 返回一个数字。该值可能是NaN,但碰巧NaN 实际上是一个数字,尽管它本质上坚持它不是。

【讨论】:

  • @Tushar ??这不会排除零,因为typeof 0"number"
  • @Tushar 请注意,OP 明确 想要排除零。
  • 哦,我以为他要排除零
  • 我知道问题不在于缩短/优化代码,而是可以通过返回过滤器return l.filter(function(n) { return typeof n === "number"; });的结果来缩短代码
【解决方案2】:

如果您只想严格过滤掉整数,请尝试使用这些辅助函数和 Array.filter

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

function isInt(n) {
  return isNumber(n) && n % 1 === 0;
}

this fiddle试试这些

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

function isInt(n) {
  return isNumber(n) && n % 1 === 0;
}

var array = [99,5,'love','hate'];

var result = array.filter(function(x) {
  return isInt(x);
});

document.querySelector('#output').innerHTML = JSON.stringify(result, null, 4);
Array: [99,5,'love','hate']
<br/>Result: <pre id="output"></pre>

编辑:这也有返回整数的字符串表示的副作用 - 所以[99,5,'love','hate', '23'] 将返回[99, 5, '23'],这可能不是你想要的。

【讨论】:

  • 小心 - parseFloat() 为字符串 "23skidoo" 返回数字 23!这也允许看起来像有效数字的字符串,这可能是也可能不是 OP 想要的(尚不清楚)。
  • 同意。这就是为什么isNumber 函数也会检查isFinite 的原因。但是这个解决方案的一个(可能是不希望的)副作用是一个整数字符串也会进入返回的列表。我会把它添加到答案中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 2016-10-26
  • 2020-02-05
相关资源
最近更新 更多