我是stackoverflow的新手,希望您能给我一些建议,帮助我解决这个问题.

String 1 = "12.3,Name1,3,4,Name2,35,Name3"返回[12.3,3,4,35]

这是必需的结果.

String 2 = "12.3,22,Q"返回[12.322],这是不正确的结果,应该是[12.3,22]

我已经 comments 了我的代码以及我为完成任务所采取的步骤.

这是我的代码副本:

function extractNumbers(str) {
  //Use replace() to replace all instances of letters/alpha*

  let onlyNumbersString = str.replace(/[a-z]/ig, '');

  //remove "," using replace()*

  onlyNumbersString = onlyNumbersString.replace(",", "");

  //Create an array of numbers* 
  let arrayOfNumbers = onlyNumbersString.split(',');


  let result = arrayOfNumbers.map((x) => parseFloat(x))
  console.log(arrayOfNumbers)
  console.log(result);

  const filtered = result.filter(function(e) {
    return e
  })
  console.log(filtered)
}


let numbers = "12.3,Name1,3,4,Name2,35,Name3" //returns [12.3,3,4,35]
//"12.3,22,Q" returns [12.322]*

extractNumbers(numbers)

推荐答案

错误的结果是因为这一行:

onlyNumbersString = onlyNumbersString.replace(",", "");

一旦你这样做了,"12.3,22,"(之前是"12.3,22,Q",但之前go 掉了Q)变成了"12.322",所以看起来就像一个数字.

我将分割first,然后删除其中包含非数字文本的段,然后转换为数字:

function extractNumbers(str) {
    // Split on commas, since that seems to be the delimiter you want
    const parts = str.split(",");

    // Remove any strings that aren't all number chars (including `.`)
    const filtered = parts.filter((s) => !/[^.\d]/.test(s));

    // Convert to number
    const numbers = filtered.map((s) => parseFloat(s));
    return numbers;
}

console.log(extractNumbers("12.3,Name1,3,4,Name2,35,Name3"));

或无意见:

function extractNumbers(str) {
    const parts = str.split(",");
    const filtered = parts.filter((s) => !/[^.\d]/.test(s));
    const numbers = filtered.map((s) => parseFloat(s));
    return numbers;
}

您可以将其制作为一条语句,但调试变得更加困难:

function extractNumbers(str) {
    return str
        .split(",")
        .filter((s) => !/[^.\d]/.test(s))
        .map((s) => parseFloat(s));
}

我应该注意的是,判断一个段是否有效的唯一原因是parseFloat将愉快地接受"123abc",返回123并忽略其余部分.您可以使用一元+运算符或Number函数,判断""情况(如果不删除它,则会得到0):

function extractNumbers(str) {
    const parts = str.split(",");
    const numbers = parts.map((s) => s.trim() ? +s : NaN);
    const validNumbers = numbers.filter((num) => !isNaN(num));
    return validNumbers;
}

console.log(extractNumbers("12.3,Name1,3,4,Name2,35,Name3"));

我的答案here介绍了将字符串转换为数字的各种选项以及它们各自的缺陷.

Javascript相关问答推荐

如何在模块层面提供服务?

如何在 cypress 中使用静态嵌套循环

Ember.js 5.4更新会话存储时如何更新组件变量

使用Java脚本导入gltf场景并创建边界框

ChartJs未呈现

Eval vs函数()返回语义

将Node.js包发布到GitHub包-错误ENEEDAUTH

在FAQ Accodion应用程序中使用React useState时出现问题

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

无法设置RazorPay订阅API项目价格

如何在脚本编译后直接将RxJ模块导入浏览器(无需Angel、webpack、LiteServer)

AG-GRIDreact 显示布尔值而不是复选框

Angel Auth Guard-用户只有在未登录时才能访问登录页面,只有在登录时才能访问其他页面

限制数组中每个元素的长度,

每隔一行文本段落进行镜像(Boustrophedon)

如何缩小函数中联合返回类型的范围

如何让noWrap在嵌套在Alert/AlertTitle组件中的排版组件中工作?

在D3.js中创建具有旋转手柄的可拖动、可调整大小的框?

我如何才能阻止我的球数以指数方式添加到我的HTML画布中?

如何导入我在Web Worker创建的函数?