【问题标题】:Breaking strings in an array into subarrays将数组中的字符串分解为子数组
【发布时间】:2018-05-04 21:32:44
【问题描述】:

做 DNA 挑战,如此接近但显然误解了prototype.split("")。将这些字符串["AC", "CA", "TA"] 转换为子数组的最佳方法是什么? [["A","C"]["C","A"]["T","A"]]

function pairElement(str) {
  //break into array
  var arr = str.split("");

  //add new letter (could be refactored as switch)
  for (i = 0; i < arr.length; i++) {
    if (arr[i] == "G") {
      arr[i] += "C";
    } else if (arr[i] == "C") {
      arr[i] += "G";
    } else if (arr[i] == "T") {
      arr[i] += "A";
    } else if (arr[i] == "A") {
      arr[i] += "T";
    }
  }

  //break into arrays again
  //this is how I'm trying to use.split to break it up. Doesn't work.
  var broken = [];
  for (x = 0; x < arr.length; x++) {
    broken += arr[x].split("");
  }

  //return
  return arr;
}

console.log(pairElement("GCG"));

【问题讨论】:

    标签: javascript arrays algorithm


    【解决方案1】:

    您可以通过"" 使用.mapsplit

    var o =  ["AC", "CA", "TA"];
    
    var s =  o.map(e=> e.split(""));
    
    console.log(s)

    【讨论】:

      【解决方案2】:

      您实际上只需将拆分结果推送到损坏的数组中并返回它!

      function pairElement(str) {
        //break into array
        var arr = str.split("");
      
        //add new letter (could be refactored as switch)
        for (i = 0; i < arr.length; i++) {
          if (arr[i] == "G") {
            arr[i] += "C";
          } else if (arr[i] == "C") {
            arr[i] += "G";
          } else if (arr[i] == "T") {
            arr[i] += "A";
          } else if (arr[i] == "A") {
            arr[i] += "T";
          }
        }
      
        //break into arrays again
        //this is how I'm trying to use.split to break it up. Doesn't work.
        var broken = [];
        for (x = 0; x < arr.length; x++) {
          broken.push(arr[x].split(""));
        }
      
        //return
        return broken;
      }
      
      console.log(pairElement("GCG"));

      【讨论】:

      • 这可能不是最简洁的语法,但您会得到答案,因为您完全正确 yaaaaaay!谢谢!
      • 那么重点是让您了解问题出在哪里!从那里你可以优化你的代码!
      【解决方案3】:

      要回答您的“什么是最好的方法”问题,请将您的数组映射到它们自身的拆分版本中:

      const subarrays = array.map(pair => pair.split());
      

      【讨论】:

        【解决方案4】:

        功能风格非常简单:

        > seq = ['AC', 'CA', 'TA']
        [ 'AC', 'CA', 'TA' ]
        > seq.map(s => s.split(''))
        [ [ 'A', 'C' ], [ 'C', 'A' ], [ 'T', 'A' ] ]
        

        【讨论】:

        • 很高兴看到这样做的干净方式。谢谢!
        【解决方案5】:

        总的来说,我会对整个函数进行一些重构:

        var m = new Map([["G", "C"], ["C", "G"], ["A", "T"], ["T", "A"]]);
        
        function pairElement(str) {
          return [...str].map(c => [c, m.get(c)]);
        }
        
        console.log(pairElement("GCG"));

        如果保证子数组永远发生变异,那么您可以通过重用数组而不是一遍又一遍地创建它们来节省大量内存.

        var m = new Map([["G", ["G", "C"]], ["C", ["C", "G"]], ["A", ["A", "T"]], ["T", ["T", "A"]]]);
        
        function pairElement(str) {
          return [...str].map(c => m.get(c));
        }
        
        console.log(pairElement("GCG"));

        但要直接回答您的问题,您可以在没有明确的.split() 电话的情况下进行。既然你知道总是有两个字符,你可以对字符串使用参数解构。

        var arr = ["AC", "CA", "TA"];
        
        var s = arr.map(([a, b]) => [a, b]);
        
        console.log(s)

        或者使用 rest 语法甚至更短一点,像这样:

        var arr = ["AC", "CA", "TA"];
        
        var s = arr.map(([...a]) => a);
        
        console.log(s)

        或者在数组字面量中使用展开语法:

        var arr = ["AC", "CA", "TA"];
        
        var s = arr.map(s => [...s]);
        
        console.log(s)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-10
          • 2016-04-01
          • 2021-11-29
          相关资源
          最近更新 更多