如何改进和缩短这段代码?

Coc*_*ade 9 javascript arrays for-loop

此函数采用一串 DNA,例如“GTCA”,并返回一个包含正确匹配的 DNA 对的数组。

function pairDNA(dna) {

  const pairs = []

  for (let i = 0; i < dna.length; i ++) {

    if (dna[i] === "C" | dna[i] === "c") {
      pairs.push("CG");
    } else if (dna[i] === "G"| dna[i] === "g") {
      pairs.push("GC");
    } else if (dna[i] === "T"| dna[i] === "t") {
    pairs.push("TA");
    } else if (dna[i] === "A"| dna[i] === "a") {
      pairs.push("AT");
    }
  }

return pairs;
}
Run Code Online (Sandbox Code Playgroud)

这是对的。但是,我正在尝试找到一种更短、更简单的书写方式。任何人都可以帮助我解决我应该使用的问题吗?

Mah*_*Ali 13

您可以按以下步骤改进代码:

  • 当有多个 if 语句并且都具有相同的结构时,您可能需要使用一个对象
  • 您需要检查大写和小写。只需toLowerCase()在输入上使用。
  • 您可以split使用字符串和map()它,而不是在其中创建数组push()值。

function pairDNA(dna) {
  const obj = {
    c: 'CG',
    g: 'GC',
    t: 'TA',
    a: "AT"
  }
  return dna.split('').map(x => obj[x.toLowerCase()])

}
Run Code Online (Sandbox Code Playgroud)

如果字符串可以包含任何其他特定字母,那么您需要之后filter()undefinedmap

return dna.split('').map(x => obj[x.toLowerCase()]).filter(x => x !== undefined)
Run Code Online (Sandbox Code Playgroud)

@RobG 在评论中提到了另一个更好的方法,即我们可以在循环之前从字符串中删除不需要的字母。

return dna
        .toLowerCase()
        .replace(/[^cgta]/g,'')
        .split('')
        .map(x => obj[x])
Run Code Online (Sandbox Code Playgroud)