DNA配对挑战

时间:2021-03-05 11:14:37

标签: javascript

我试图用过滤器方法解决 DNA 配对挑战。但在某处我遗漏了一些东西。我缺少什么?

挑战描述:

  1. DNA 链缺少配对元件。
  2. 获取每个字符,获取其对,并将结果作为 2d 返回 数组。
  3. 碱基对是一对 AT 和 CG。
  4. 将缺失的元素与提供的字符进行匹配。
  5. 返回提供的字符作为每个数组中的第一个元素。

例如,对于输入GCG,它应该返回[["G", "C"], ["C","G"], ["G", "C"]]

    let arr = [];
    
    function pairElement(str) {
      let test = str.split("");
      return test.filter((element) => {
        arr.push(pairElementDna(element));
        console.log(arr);
        return arr;
      });
    
      function pairElementDna(character) {
        let arr = [];
    
        if (character === "G") {
          arr.push(character, "C");
        }
        if (character === "C") {
          arr.push(character, "G");
        }
        if (character === "A") {
          arr.push(character, "T");
        }
        if (character === "T") {
          arr.push(character, "A");
        }
        return arr;
      }
    }
    
    console.log(pairElement("GCG"));

2 个答案:

答案 0 :(得分:4)

您的代码过于复杂,您是否有理由尝试使用过滤器来实现?

Array.filter 返回数组的浅拷贝,其中根据从回调返回的值的“真实性”删除了元素。您总是返回一个真值,因此不会删除任何内容。

您正在将单个字符映射到成对数组。尝试使用适当的数组函数保持简单:Array.map!更容易阅读。

const dnaPairs = {
  "G": "C",
  "C": "G",
  "A": "T",
  "T": "A"
};

function pairElements(elements) {
  return elements.split("").map(ch => [ch, dnaPairs[ch]]);
}

// log the stringified result as it's easier to read.
console.log(JSON.stringify(pairElements("GCG")));

修复代码

看起来您使用的是 filter 而不是循环。请不要这样做,这会使代码更难以阅读和理解,因为这不是 filter 的用途。

话虽如此,您的代码几乎“有效”,您记录的是源数组的过滤副本(filter 的结果),而不是您在循环中构建的数组(arr )。这是“固定”版本。

let arr = [];

function pairElement(str) {
  let test = str.split("");
  let filteredResult = test.filter((element) => {
    arr.push(pairElementDna(element));
    //console.log(arr);
    return arr;
  });

  console.log(arr);
  return filteredResult;

  function pairElementDna(character) {
    let arr = [];

    if (character === "G") {
      arr.push(character, "C");
    }
    if (character === "C") {
      arr.push(character, "G");
    }
    if (character === "A") {
      arr.push(character, "T");
    }
    if (character === "T") {
      arr.push(character, "A");
    }
    return arr;
  }
}

pairElement("GCG")

UPDATE 根据 OP 在评论中的要求,将结果记录添加到 pairElement 函数

答案 1 :(得分:0)

我缺少在代码块的末尾添加 return arr; 语句,我使用了全局变量而不是使用我在顶部 let arr= []; 定义的数组的局部变量。

function pairElement(str) {
  let arr = [];

  let test = str.split("");
  test.filter((element) => {
    arr.push(pairElementDna(element));
    return arr;
  });
  function pairElementDna(character) {
    let arr = [];

    if (character === "G") {
      arr.push(character, "C");
    }
    if (character === "C") {
      arr.push(character, "G");
    }
    if (character === "A") {
      arr.push(character, "T");
    }
    if (character === "T") {
      arr.push(character, "A");
    }
    return arr;
  }
  return arr;
}

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