Я, мабуть,:
Використовуйте for-ofцикл (або можливо зіставлення з можливою фільтрацією)
Використовуйте об’єкт пошуку або Мапу
Зробіть рядок нижнього або верхнього регістру під час перемикання / пошуку (але також дублюються записи у перемикачі / пошуку):
Якщо ви знаєте, що dnaбуде містити лише коли-небудь c/ C, g/ G, t/ T/ або a/ A(що, наскільки я розумію, це стосується ДНК ;-)), тоді ви можете використовувати Array.fromйого функцію відображення з об'єктом пошуку / Map:
const table = {
c: "CG",
g: "GC",
t: "TA",
a: "AT"
};
function pairDNA(dna) {
return Array.from(dna, entry => table[entry.toLowerCase()]);
}
Я використовую, Array.fromтому що вона розділить рядок на кодові точки , а не лише на кодові одиниці (не розбиває сурогатні пари) і має функцію відображення, якщо ви надаєте функцію відображення. ( В основному, Array.from(str, mappingFunction)це , [...str].map(mappingFunction)але без проміжного масиву.) Ймовірно , не всі , що ставлення тут дається зміст вашої рядка, але може мати значення , якщо ваша рядок може містити сурогатні пари.
Або з 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()));
}
Якщо ви не можете зробити це припущення, додайте .filterдля фільтрування тих, у яких не було відповідності:
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);
}
Або якщо ви хочете уникнути створення додаткового масиву, який filterбуде створено, дотримуйтесь for-of(або навіть вашого 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;
}