Javascript 取一个字符串,计算它的值,找出是否有一个数字,然后将字符串的一部分重复该次数?

Javascript 取一个字符串,计算它的值,找出是否有一个数字,然后将字符串的一部分重复该次数?,javascript,Javascript,我在写代码时遇到了这个问题, 您有一个特定字符串,其格式如下: d ae2 n s 现在我们要用一种特殊的方式来解读它 按空格将其拆分为不同的部分,形成一个类似[“d”、“ae2”、“n”、“s”的数组 计算数组的每个元素,并找出其中是否有数字 如果有数字,则重复字符串的次数 将其添加到数组中并继续。 所以输出数组应该是 我已经试了很多,但一无所获 我之前使用过此代码,但它以第二个字符串结尾: var str = "d ae2 n s" var res = str.split(" "); a

我在写代码时遇到了这个问题, 您有一个特定字符串,其格式如下:

 d ae2 n s
现在我们要用一种特殊的方式来解读它

  • 按空格将其拆分为不同的部分,形成一个类似[“d”、“ae2”、“n”、“s”的数组

  • 计算数组的每个元素,并找出其中是否有数字

  • 如果有数字,则重复字符串的次数

  • 将其添加到数组中并继续。 所以输出数组应该是

  • 我已经试了很多,但一无所获

    我之前使用过此代码,但它以第二个字符串结尾:

    var str = "d ae2 n s"
    var res = str.split(" ");
    alert(res.length);
    for(var x = 0; x < res.length; x++ ){
      var std = res[x];
      var fun = checkNum(std);
      if(fun === true){
       var numbers = str.match(/\d+/g).map(Number);
        var index = res.indexOf(std);
       var result =  std.replace(/[0-9]/g, '');
        var res2 = result.repeat(numbers);
       res[index] = res2;
      }
      else{
        continue;
      }
    
     for(var i = 0; i < res.length; i++ ){
       console.log(res[x]);
     }
    }
    function checkNum(t){ 
    return /\d/.test(t);
    }
    // I am a terible coder :/
    
    var str=“d ae2 n s” var res=str.split(“”); 警报(res.length); 对于(var x=0;x 预期输入:d ae2 n s


    预期输出:[“d”、“ae”、“ae”、“n”、“s”]

    您只需在数组上循环,然后填充另一个数组,该数组将在检查数字后保存您的结果:

    const results=[];
    “d ae2 n s”。拆分(“”)。forEach(令牌=>{
    const match=token.match(/\d+/);
    如果(匹配){
    const newStr=token.split(/\d/)[0];
    for(设i=0;i您可以执行以下操作:

    const str1='d ae2 n s';
    const str2='e d aefg4 m n s';
    常量正则表达式=/\d+/;
    const getResult=input=>input.split(“”).reduce((a,c)=>{
    常数n=c.match(正则表达式);
    返回n
    ?[…a.concat(c.replace(n.))。重复(n)。trim()。split(“”))]
    :[…a,c];
    }, []);
    console.log(getResult(str1));
    console.log(getResult(str2))使用和方法以及

    正则表达式替换

    • /[^0-9]/
      -所有非数字字符

    • /[0-9]/
      -所有数字字符

    var str='d ae2 n s'
    var res=str
    .拆分(“”)
    .flatMap(i=>
    数组(+i.replace(/[^0-9]/g',)|1)
    .填充(即替换(/[0-9]/g.))
    )
    
    console.log(res)
    您可以查看Seblor的答案以获得优化的逻辑。我已经修改了您的代码,这样您就可以很容易地理解在执行此操作时出现的错误。我已将注释添加到您的代码中,并在其中更改了内容:

    var str = "d ae2 n s"
    var res = str.split(" ");
    
    // create a variable to store the output.
    var output = [];
    for(var x = 0; x < res.length; x++ ){
      var std = res[x];
      var fun = checkNum(std);
      if(fun === true){
    
        // map returns an array, so take the first element, it will be your number.
       var numbers = str.match(/\d+/g).map(Number)[0];
        var index = res.indexOf(std);
        var result =  std.replace(/[0-9]/g, '');
    
        // instead of doing the repeat and updating the current index,
        // push the result, i.e. the current string to be repeated "numbers" times into
        // the output array.
        for (var i = 0; i < numbers; i++) {
          output.push(result)
        }
      }
      else{
    
        // if does not contain any number, push the current item to ouput
        output.push (std);
        continue;
      }
    }
    function checkNum(t){ 
    return /\d/.test(t);
    }
    console.log(output);
    
    var str=“d ae2 n s” var res=str.split(“”); //创建一个变量来存储输出。 var输出=[]; 对于(var x=0;x
    您可以尝试以下方法:

    let str = "d ae2 n s"
    let split = str.split(" ")
    let rx = new RegExp("[0-9]")
    let res = [];
    split.forEach(s => {
      if(rx.exec(s) !== null) {
        let rxResult = rx.exec(s)
        let count = rxResult[0];
        let matchIdx = rxResult[1];
        for(let i = 0; i < count; i++) {
          res.push(s.replace(count, ""))
        }
      } else {
        res.push(s);
      }
    })
    
    让str=“d ae2 n s” let split=str.split(“”) 设rx=newregexp(“[0-9]”) 设res=[]; split.forEach(s=>{ 如果(rx.exec)!==null){ 设rxResult=rx.exec let count=rxResult[0]; 设matchIdx=rxResult[1]; for(设i=0;i
    您可以使用阵列原型
    reduce
    filter

    const输入='dae2 n s';
    常量输出=输入。拆分(“”)。减少((内存,当前)=>{
    常量numberIndex=current.split(“”).findIndex(c=>!isNaN(c));
    const newCurrent=current.split(“”).filter((u,index)=>index!==numberIndex.join(“”);
    如果(numberIndex!=-1){
    for(设i=0;i控制台日志(输出)总是很高兴看到有人修改操作代码,让他明白什么是错误的谢谢:)我同意。我认为它提供了洞察力,也许还鼓励人们建立逻辑。干杯:)高“整洁”水平!CoolPeople不应该再使用
    var
    。自ECMAScript 2015以来,这被认为是不好的做法。同意,切换到
    let
    。然而,例如Douglas Crockford声称,
    var
    非常好,如果你知道你在做什么:)是的,
    var
    仍然可以是“好的”,但是它实际有用的用例几乎不存在。根据我所能找到的,道格拉斯·克罗克福德所说的是:“在极端情况下,var可能仍然有用,比如机器生成的代码,但我正在努力扩展。”因此,
    var
    不应该出现在任何StackOverflow答案中,IMHO。感谢您编辑您的答案:)并感谢您就
    var
    s和
    let
    s:)进行了富有成效的讨论
    let str = "d ae2 n s"
    let split = str.split(" ")
    let rx = new RegExp("[0-9]")
    let res = [];
    split.forEach(s => {
      if(rx.exec(s) !== null) {
        let rxResult = rx.exec(s)
        let count = rxResult[0];
        let matchIdx = rxResult[1];
        for(let i = 0; i < count; i++) {
          res.push(s.replace(count, ""))
        }
      } else {
        res.push(s);
      }
    })