2016-07-30 3 views
1

サンプルコードの末尾にconsole.log出力を取得しようとしています。現在、私のコードはundefinedを返しています。私が間違っていた部分を知りたい。JavaScriptで、入力文字列が与えられた場合、n個の2次元配列を含む配列を返す関数を作成します。

また、問題を解決するために他のより効率的な方法があるかどうかを知りたいと思います。返された何

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

なぜ2回に分割していますか? –

+0

私は最初の分割が "ATCG"に "ATCG"入力をすると思います。次に、2番目の分割は[["A"]、["T"]、["C"] [G "]になり、必要な2層の深い配列が作成されます。次に、レイヤー1配列のインデックスに基づいてプッシュまたはリターンする必要があると私は考えています。 – jpls93

答えて

2

.splitを2回行う必要はありません。ここでは可能なソリューションです:

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 iteratorメソッドは何も返しません。分割された配列内のすべての項目に対して実行されます。

おそらく.map(...)を意味しましたか?これは、コールバック関数から返された値を受け取り、それらを使って新しい配列を作成します。

1

あなたは何度も分割しており、foreachは必要ありません。分割により、文字列からの配列(つまり、["A","T","C","G"])が作成されます。マップは、その後

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

(すなわち"A"["A","T"]なる)を使用.MAP代わり.forEachあなたの機能に応じて変更各要素を使用して新しい配列を作成します。 .forEach()は配列要素ごとにコールバック関数を1回実行します。 map()やreduce()と異なり、常に未定義の値を返し、連鎖はできません。典型的な使用例は、チェーンの終わりに副作用を実行することです。

関連する問題