2016-07-30 95 views
1

我试图在示例代码的底部获取console.log输出。目前,我的代码正在返回undefined。我想知道我做错了哪一部分。在JavaScript中,给定一个输入字符串,创建一个返回包含n个二维数组的数组的函数

我也想知道在解决问题时是否还有其他更有效的方法。

function pairElement(str) { 

    return str.split('') 
    .forEach(function(element){ 
     return element.split('').map(function(pair){ 
     if (pair == "G") {return ["G","C"];} 
     else if (pair == "C") {return ["C","G"];} 
     else if (pair == "T") {return ["T","A"];} 
     else {return ["A","T"];} 
     }); 
    }); 
} 

console.log(pairElement("ATCG")); 
// -> Should be [["A","T"], ["T","A"], ["C","G"], ["G","C"]] 
// -> But currently, it is returning undefined 
+2

你为什么要分裂两次? –

+0

我认为第一次拆分会使“ATCG”输入到[“ATCG”]中。然后第二次分割成[[“A”],[“T”],[“C”],[“G”]],创建我需要的2层深度数组。然后我认为需要根据第1层数组的索引来推送或返回。 – jpls93

回答

2

您不需要做两次.split。这里的一个可能的解决方案:

function pairElement(input){ 
    var pairs = { A: "T", T: "A", C: "G", G: "C" }; 
    return input.split("").map(char => [char, pairs[char]]); // ES6 arrow function 
} 

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

Fiddle


"ATCG".split("")接通串到一个数组["A", "T", "C", "G"]。然后通过应用映射函数,我们可以将输出逐字符地转换成预定义的对[["A","T"], ["T","A"], ["C","G"], ["G","C"]]

+0

接受这是正确的答案,因为它演示了如何使用键/值对而不是if/else语句**。谢谢。正因为如此,我学到了一种新技术。 – jpls93

+0

平凡优化:因为它可能是静态的,所以在函数外部移动对var,所以每次函数调用时都不会创建它。 – Tibrogargan

1

什么是返回是str.split('').forEach(...)。 forEach迭代器方法不返回任何东西;它只是为分割数组中的每个项目运行。

也许你的意思是改为.map(...)?这将从回调函数获取返回的值并使用它们创建一个新数组。

1

你分裂太多次了,你不需要foreach。分割会从字符串中创建一个数组(即["A","T","C","G"])。地图然后创建具有根据你的函数修改的每个元素的新阵列(即"A"变得["A","T"]

function pairElement(str) { 
    return str.split('').map(function(element){ 
     if (element == "G") {return ["G","C"];} 
     else if (element == "C") {return ["C","G"];} 
     else if (element == "T") {return ["T","A"];} 
     else {return ["A","T"];} 
    }); 
} 
1

使用.MAP代替.forEach。 .forEach()为每个数组元素执行一次回调函数;与map()或reduce()不同,它总是返回未定义的值并且不可链接。典型的用例是在链的末尾执行副作用。

相关问题