Я, мабуть,:
Використовуйте 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;
}