2016-07-30 16 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()不同,它總是返回未定義的值並且不可鏈接。典型的用例是在鏈的末尾執行副作用。

相關問題