Probabilmente avrei:
Usa un for-of
loop (o eventualmente mappando con un possibile filtro)
Usa un oggetto di ricerca o Mappa
Rendi la stringa minuscola o maiuscola quando cambi / cerca (ma funzionano anche le voci duplicate nel cambio / ricerca):
Se sai che dna
conterrà sempre c
/ C
, g
/ G
, t
/ T
/ o a
/ A
(che, a quanto ho capito, è vero per il DNA ;-)), puoi usare la Array.from
sua funzione di mappatura con un oggetto di ricerca / Mappa:
const table = {
c: "CG",
g: "GC",
t: "TA",
a: "AT"
};
function pairDNA(dna) {
return Array.from(dna, entry => table[entry.toLowerCase()]);
}
Sto usando Array.from
perché dividerà la stringa su punti di codice , non solo unità di codice (non spezza le coppie surrogate) e ha una funzione di mappatura se si fornisce una funzione di mappatura. (Fondamentalmente, Array.from(str, mappingFunction)
è [...str].map(mappingFunction)
ma senza l'array intermedio.) Probabilmente non tutto ciò che è rilevante qui dato il contenuto della stringa, ma può importare se la stringa può contenere coppie surrogate.
O con un 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()));
}
Se non riesci a fare questo presupposto, aggiungi .filter
per filtrare quelli che non avevano una corrispondenza:
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);
}
O se vuoi evitare di creare l'array aggiuntivo filter
che creerebbe, mantieni for-of
(o anche il tuo 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;
}