我试图用过滤器方法解决 DNA 配对挑战。但在某处我遗漏了一些东西。我缺少什么?
挑战描述:
例如,对于输入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"));
答案 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"));