Я бы наверное:
Используйте 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;
}