私はおそらく:
for-of
ループを使用します(または可能なフィルタリングを使用してマッピングします)
ルックアップオブジェクトまたはマップを使用する
切り替え/検索時に文字列を小文字または大文字にします(ただし、切り替え/検索の重複したエントリも機能します)。
/ 、/ 、/ /、または/ dna
のみが含まれることがわかっている場合(私が理解しているように、これはDNAにも当てはまります;-))、ルックアップオブジェクト/マップでそのマッピング機能を使用できます。c
C
g
G
t
T
a
A
Array.from
const table = {
c: "CG",
g: "GC",
t: "TA",
a: "AT"
};
function pairDNA(dna) {
return Array.from(dna, entry => table[entry.toLowerCase()]);
}
私が使用しArray.from
ているのは、コード単位だけでなく(サロゲートペアを分割しない)コードポイントで文字列を分割し、マッピング関数を提供した場合にマッピング機能があるためです。(基本的にArray.from(str, mappingFunction)
はです[...str].map(mappingFunction)
が、中間配列はありません。)文字列の内容を考えると、おそらくここで関連するものはすべてではありませんが、文字列にサロゲートペアが含まれている場合は問題になる可能性があります。
またはMap
:
const table = new Map([
[c, "CG"],
[g, "GC"],
[t, "TA"],
[a, "AT"]
]);
function pairDNA(dna) {
return Array.from(dna, entry => table.get(entry.toLowerCase()));
}
その仮定を行うことができない場合は、追加.filter
して、一致しなかったものを除外します。
function pairDNA(dna) {
return Array.from(dna, entry => table.get(entry.toLowerCase())).filter(Boolean);
// or if using an object: return dna.map(entry => table[entry.toLowerCase()]).filter(Boolean);
}
または、作成する追加の配列の作成を避けたい場合はfilter
、for-of
(またはfor
)に固執します。
const table = {
c: "CG",
g: "GC",
t: "TA",
a: "AT"
};
function pairDNA(dna) {
const pairs = [];
for (const entry of dna) {
const value = table[entry.toLowerCase()];
if (value) {
pairs.push(value);
}
}
return pairs;
}