Ta funkcja pobiera ciąg DNA, taki jak „GTCA” i zwraca tablicę zawierającą odpowiednio dopasowane pary DNA.
function pairDNA(dna) {
const pairs = []
for (let i = 0; i < dna.length; i ++) {
if (dna[i] === "C" | dna[i] === "c") {
pairs.push("CG");
} else if (dna[i] === "G"| dna[i] === "g") {
pairs.push("GC");
} else if (dna[i] === "T"| dna[i] === "t") {
pairs.push("TA");
} else if (dna[i] === "A"| dna[i] === "a") {
pairs.push("AT");
}
}
return pairs;
}
To jest poprawne. Próbuję jednak znaleźć krótszy, prostszy sposób na napisanie tego. Czy ktoś może mi pomóc z tym, czego powinienem używać?
javascript
arrays
for-loop
CocoFlade
źródło
źródło
|
nie robi logicznego LUB w JavaScript, jak||
||
byłoby jednak lepiej).Odpowiedzi:
Możesz poprawić swój kod, wykonując następujące czynności:
toLowerCase()
na wejściu.split
ciąg imap()
to zamiast tworzyć w nimpush()
wartości tablicowe .Jeśli ciąg może zawierać cokolwiek innego niż określone litery, musisz
filter()
wprowadzićundefined
wartości pomap
Kolejna lepsza rzecz jest wspomniana przez @RobG w komentarzach, że możemy usunąć niechciane litery z łańcucha przed zapętleniem go.
źródło
undefined
wartości w końcowej tablicy.dna.toLowerCase().replace(/[^cgta]/g,'')...
. ;-)[...dna]
. Nie rozkłada par surogatów. (LubArray.from
, co jest szczególnie przydatne, jeśli masz zamiar map:Array.from(dna, mappingFunction)
). (Nie wszystko, co istotne tutaj, zakładamdna
zawiera tylkoc
,g
,t
, ia
.)Prawdopodobnie:
Użyj
for-of
pę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
dna
będzie zawierałc
/C
,g
/G
,t
/T
/ luba
/A
(co, jak rozumiem, dotyczy DNA ;-)), możesz użyćArray.from
jego funkcji mapowania z obiektem wyszukiwania / Mapą:Używam,
Array.from
ponieważ 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. (ZasadniczoArray.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
:Jeśli nie możesz przyjąć tego założenia, dodaj,
.filter
aby odfiltrować te, które nie pasowały:Lub jeśli chcesz uniknąć tworzenia dodatkowej tablicy, którą
filter
by utworzył, trzymaj sięfor-of
(lub nawet swojejfor
):źródło
Aby uprościć pętlę, możesz użyć odwzorowania wyszukiwania:
źródło
Może nie skrócony, ale zdecydowanie łatwiejszy w utrzymaniu.
Możesz także:
źródło
Możesz spróbować użyć a
switch case
iforEach
funcion, takich jak to:źródło
Możesz wpisać małe litery, które pozwolą ci usunąć sprawdzanie łańcucha:
źródło
źródło