Prawdopodobnie:
Użyj for-ofpętli (lub ewentualnie mapowania z możliwym filtrowaniem)
Użyj obiektu wyszukiwania lub mapy
Ustaw ciąg jako małe lub wielkie litery podczas przełączania / wyszukiwania (ale działają również zduplikowane wpisy w przełączniku / wyszukiwaniu):
Jeśli wiesz, że zawsze dnabędzie zawierał c/ C, g/ G, t/ T/ lub a/ A(co, jak rozumiem, dotyczy DNA ;-)), możesz użyć Array.fromjego funkcji mapowania z obiektem wyszukiwania / Mapą:
const table = {
c: "CG",
g: "GC",
t: "TA",
a: "AT"
};
function pairDNA(dna) {
return Array.from(dna, entry => table[entry.toLowerCase()]);
}
Używam, Array.fromponieważ podzieli ciąg na punkty kodowe , nie tylko jednostki kodowe (nie rozbija par zastępczych) i ma funkcję mapowania, jeśli udostępnisz funkcję mapowania. (Zasadniczo Array.from(str, mappingFunction)jest, [...str].map(mappingFunction)ale bez pośredniej tablicy). Prawdopodobnie nie wszystko, co jest istotne, biorąc pod uwagę zawartość łańcucha, ale może mieć znaczenie, jeśli łańcuch może zawierać pary zastępcze.
Lub z 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()));
}
Jeśli nie możesz przyjąć tego założenia, dodaj, .filteraby odfiltrować te, które nie pasowały:
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);
}
Lub jeśli chcesz uniknąć tworzenia dodatkowej tablicy, którą filterby utworzył, trzymaj się for-of(lub nawet swojej 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;
}