Yo probablemente:
Use un for-ofbucle (o posiblemente un mapeo con posible filtrado)
Use un objeto de búsqueda o un mapa
Haga que la cadena sea minúscula o mayúscula al cambiar / mirar hacia arriba (pero las entradas duplicadas en el cambio / búsqueda también funcionan):
Si sabe que dnasolo contendrá c/ C, g/ G, t/ T/ o a/ A(que, según tengo entendido, es cierto para el ADN ;-)), puede usarlo Array.fromcon su función de mapeo con un objeto de búsqueda / Mapa:
const table = {
c: "CG",
g: "GC",
t: "TA",
a: "AT"
};
function pairDNA(dna) {
return Array.from(dna, entry => table[entry.toLowerCase()]);
}
Estoy usando Array.fromporque dividirá la cadena en los puntos de código , no solo las unidades de código (no divide los pares sustitutos) y tiene una función de mapeo si proporciona una función de mapeo. (Básicamente, Array.from(str, mappingFunction)es [...str].map(mappingFunction)pero sin la matriz intermedia.) Probablemente no sea tan relevante aquí dado el contenido de su cadena, pero puede importar si su cadena puede contener pares sustitutos.
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()));
}
Si no puede hacer esa suposición, agregue .filterpara filtrar los que no coinciden:
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 si desea evitar crear la matriz adicional filterque crearía, quédese con for-of(o incluso su 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;
}