Eu provavelmente:
Use um for-ofloop (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 dnasó 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.fromcom 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.fromporque 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 .filterpara 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 filterseria 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;
}