【问题标题】:In Javascript, when I separate the strings, how should I run the method for each string after the split?在Javascript中,当我分隔字符串时,我应该如何在拆分后为每个字符串运行该方法?
【发布时间】:2021-03-17 08:07:44
【问题描述】:
function processPathLettersIntoArray(source){
    source = source.split("M").join(";M");
    source = source.split("L").join(";L");
    source = source.split("z").join(";z");
    source = source.split(";");
    source = source.slice(1);
    return source.map(mapGroup);
}

这是我的拆分方法。

function gcodeXY(source){
   var [xVal, yVal] = source.split(",");
   return `X${xVal} Y${yVal}`
}
let start="X0 Y0"; //another side effect :-(

function mapGroup(grp){
    let s=grp.split(" ");
    if (s[0]=="M"){
        start=gcodeXY(s[1]);
        last=s[1];
        return "G0 F200 "+start;
    }
    else if (s[0]=="L"){
        start=gcodeXY(s[1]);
        last=s[1];
        return "G1 F100 "+start;
    }
    else if (s[0]=="z"){
        last=s[1];
        return "G1 F100 "+start;
    }
    return grp;
}

这就是我希望每个字符串在拆分后实现的方式。

function path2gcode(source){
    source = processPathLettersIntoArray(source);
    return source;
}

这是我需要运行的方法。 我想问的是,在Javascript中,当我分割字符串时,分割后的每个字符串应该如何运行该方法?图为输入输出示例和我当前的输出。

【问题讨论】:

  • 您可以将测试输入粘贴为文本吗?
  • "M 1,2 L 2,2 L 3,3 z"
  • 根据你在做什么,看起来你只是直接打电话给processPathLettersIntoArray,所以你得到的是正确的。你没有在任何地方使用mapGroup。你有什么问题?如何将 mapGroup 函数用于数组和返回值?
  • 一个简单的for 循环应该可以完成这项工作,请在下面查看我的答案
  • 其实我被限制使用for、while和goto循环,但是我可以使用递归。

标签: javascript computer-science


【解决方案1】:

这会起作用

function processPathLettersIntoArray(source) {
  const result = source.replace(/M/g, ";M").replace(/L/g, ";L").replace(/z/g, ";z").split(';').slice(1);
  return result.map(mapGroup);
}

function gcodeXY(source) {
   const [xVal, yVal] = source.split(",");
   return `X${xVal} Y${yVal}`;
}
let start="X0 Y0"; //another side effect :-(

function mapGroup(grp) {
    let s = grp.split(" ");
    if (s[0]=="M"){
        start = gcodeXY(s[1]);
        last=s[1];
        return "G0 F200 "+start;
    }
    else if (s[0]=="L"){
        start=gcodeXY(s[1]);
        last=s[1];
        return "G1 F100 "+start;
    }
    else if (s[0]=="z"){
        last=s[1];
        return "G1 F100 "+start;
    }
    return grp;
}

function path2gcode() {
  const source = 'M 1,2 L 2,2 L 3,3 z';
  return processPathLettersIntoArray(source);
}

【讨论】:

    【解决方案2】:

    这应该适合你

    function processPathLettersIntoArray(source){
        source = source.split("M").join(";M");
        source = source.split("L").join(";L");
        source = source.split("z").join(";z");
        source = source.split(";");
        source = source.slice(1);
        output = [];
        for(i=0;i<source.length;i++) {
          output.push(mapGroup(source[i]));
        }
        return output;
    }
    

    也可以使用.map

     function processPathLettersIntoArray(source){
            source = source.split("M").join(";M");
            source = source.split("L").join(";L");
            source = source.split("z").join(";z");
            source = source.split(";");
            source = source.slice(1);
            return source.map(mapGroup);
        }
    

    【讨论】:

    • 谢谢你的回答!但其实我是被限制使用for、while和goto循环的,但是我可以使用递归。
    • @Simon 使用.map添加了一个更简单的解决方案
    • 我试过了,但是有一些问题。我放了一张新图显示错误,你可以看看。
    • 您到底尝试了什么?也许函数顶部的var last = "" 是必需的?
    • 这太牛了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 2022-12-17
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2020-08-11
    相关资源
    最近更新 更多