ฉันอาจจะ:
ใช้การfor-of
วนซ้ำ (หรือการจับคู่กับการกรองที่เป็นไปได้)
ใช้วัตถุค้นหาหรือแผนที่
ทำสตริงตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่เมื่อสลับ / ค้นหา (แต่รายการที่ซ้ำกันในสวิตช์ / ค้นหาทำงานด้วย):
หากคุณรู้ว่าdna
จะมีเพียงc
/ C
, g
/ G
, t
/ T
/ หรือa
/ A
(ซึ่งตามที่ฉันเข้าใจเป็นจริงของ DNA ;-)) จากนั้นคุณสามารถใช้Array.from
กับคุณสมบัติการทำแผนที่ด้วยวัตถุค้นหา / แผนที่:
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;
}