Eu provavelmente:
Use um for-of
loop (ou possivelmente mapeando com possível filtragem)
Use um objeto de pesquisa ou mapa
Coloque a string em minúscula ou maiúscula ao alternar / procurar (mas entradas duplicadas na alternância / pesquisa também funcionam):
Se você sabe que dna
só vai conter c
/ C
, g
/ G
, t
/ T
/ ou a
/ A
(que, como eu a entendo, é verdade de DNA ;-)), então você pode usar Array.from
com o seu recurso de mapeamento com um objeto de pesquisa / Mapa:
const table = {
c: "CG",
g: "GC",
t: "TA",
a: "AT"
};
function pairDNA(dna) {
return Array.from(dna, entry => table[entry.toLowerCase()]);
}
Estou usando Array.from
porque ele dividirá a string em pontos de código , não apenas em unidades de código (não divide os pares substitutos) e possui um recurso de mapeamento se você fornecer uma função de mapeamento. (Basicamente, Array.from(str, mappingFunction)
é [...str].map(mappingFunction)
mas sem a matriz intermediária.) Provavelmente nem tudo é relevante aqui, considerando o conteúdo da sua string, mas pode importar se ela pode conter pares substitutos.
Ou com um 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 você não pode fazer essa suposição, adicione .filter
para filtrar as que não corresponderam:
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);
}
Ou, se você deseja evitar a criação de uma matriz extra, a mesma filter
seria criada for-of
(ou mesmo a sua 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;
}