Bu kod bloğunu nasıl geliştirebilirim ve kısaltabilirim? [kapalı]


9

Bu işlev, 'GTCA' gibi bir DNA dizisi alır ve doğru eşleştirilen DNA çiftlerini içeren bir dizi döndürür.

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;
}

Doğru. Ancak yazmanın daha kısa, daha basit bir yolunu bulmaya çalışıyorum. Birisi bana kullanmam gereken şey konusunda yardımcı olabilir mi?


1
kolayca bu yöntemi kullanın dna [i] .toLowerCase ()
Thaier Alkhateeb

9
Kodunuz çalışıyorsa ve yalnızca iyileştirmeler istiyorsanız, codereview.stackexchange.com
Peter Collingridge'i

Bu kod amaçlandığı gibi çalıştığını sanmıyorum | , Javascript gibi mantıksal OR yapmaz||
ROOT

2
@mamounothman - Bu doğru, ama her ikisi de bu kodda çalışacak ( ||yine de daha iyi olurdu).
TJ Crowder

Yanıtlar:


14

Kodunuzu aşağıdaki adımlarla geliştirebilirsiniz:

  • Birden fazla if ifadesi varsa ve hepsi aynı yapıya sahipse, muhtemelen bir nesne kullanmanız gerekir
  • Hem büyük hem de küçük harfleri kontrol etmeniz gerekir. Sadece toLowerCase()girişte kullanın .
  • Dizeye bir dizi değeri oluşturmak yerine splitdizeyi ve dizeyi kullanabilirsiniz .map()push()

function pairDNA(dna) {
  const obj = {
    c: 'CG',
    g: 'GC',
    t: 'TA',
    a: "AT"
  }
  return dna.split('').map(x => obj[x.toLowerCase()])

}

Dize belirli harflerden başka bir şey içeriyorsa filter(), undefinedsonraki değerlere ihtiyacınız vardır.map

return dna.split('').map(x => obj[x.toLowerCase()]).filter(x => x !== undefined)

Bir başka daha iyi, @RGG tarafından, istenmeyen döngüleri döngüden önce dizeden kaldırabileceğimiz yorumlarda belirtilmiştir.

return dna
        .toLowerCase()
        .replace(/[^cgta]/g,'')
        .split('')
        .map(x => obj[x])

1
Dna listelenmemiş bir karakter içeriyorsa undefined, son dizinizde değerler bulunur.
Grégory NEUT

1
@ GrégoryNEUT Cevabımda bu dava için bir düzeltme eklendi
Maheer Ali

Veya dizeyi önceden işleyebilirsiniz dna.toLowerCase().replace(/[^cgta]/g,'').... ;-)
RobG

@RobG Gerçekten beğendim. Cevabımı ekledim.
Maheer Ali

1
Bir ip olduğunu özledim. :-) FWIW, dizeleri dizilere ayırmanın daha Unicode dostu bir yoludur [...dna]. Yedek çiftleri parçalamaz. (Ya Array.from, eşlemek gidiyoruz özellikle yararlıdır hangi: Array.from(dna, mappingFunction).) (Burada alakalı, ben varsayalım bütün bu değil dnaiçerdiğinde c, g, t, ve a.)
TJ Crowder

3

Muhtemelen:

  1. Bir for-ofdöngü kullanın (veya olası filtreleme ile eşleme yapın)

  2. Bir arama nesnesi veya Harita kullanma

  3. Geçiş yaparken / ararken dizeyi küçük veya büyük yapın (ancak anahtar / aramadaki yinelenen girişler de çalışır):

dnaSadece c/ C, g/ G, t/ T/ veya a/ A(bu, anladığım kadarıyla DNA ;-) için geçerlidir) içereceğini biliyorsanız , o zaman Array.frombir arama nesnesi / Harita ile eşleme özelliği ile kullanabilirsiniz :

const table = {
    c: "CG",
    g: "GC",
    t: "TA",
    a: "AT"
};

function pairDNA(dna) {
  return Array.from(dna, entry => table[entry.toLowerCase()]);
}                                                                                                                           

Ben sadece kod birimleri (vekil çiftleri ayrılmaz) değil Array.from, kod noktalarında dize bölünecek ve bir eşleme işlevi sağlarsanız bir eşleme özelliği vardır çünkü kullanıyorum . (Temel olarak, Array.from(str, mappingFunction)olduğunu [...str].map(mappingFunction)ancak orta dizinin olmadan.) Buraya alakalı dize içeriğini göz önüne alındığında, ancak dize vekil çiftleri içerebilir eğer önemli olabilir Muhtemelen hayır, hepsi bu.

Veya aşağıdakilerle 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()));
}                                                                                                                           

Bu varsayımı .filteryapamıyorsanız, eşleşmeyenleri filtrelemek için ekleyin :

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);
}

Ya da yaratacağı ekstra diziyi oluşturmaktan kaçınmak istiyorsanız filter, for-of(veya hatta for) ile sadık kalın :

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;
}

2

Döngüyü basitleştirmek için bir arama eşlemesi kullanabilirsiniz:

function pairDNA(dna) {

  const pairs = [], key = { G: "GC", C: "CG", A: "AT", T: "TA" };

  for (let i = 0; i < dna.length; i ++)
    pairs.push(key[dna[i].toUpperCase()]);
  return pairs;
}

Bu şekilde yapmayı düşünmediğim ilginç, teşekkürler!
CocoFlade

2

Belki kısaltılmamış ama kesinlikle daha sürdürülebilir.

function pairDNA(dna) {
  const map = {
    C: 'CG',
    c: 'CG',
    G: 'GC',
    g: 'GC',
    T: 'TA',
    t: 'TA',
    A: 'AT',
    a: 'AT',
  };

  return dna.split('').reduce((tmp, x) => {
    if (map[x]) {
      tmp.push(map[x]);
    }

    return tmp;
  }, []);
}

Ayrıca şunları da yapabilirsiniz:

function pairDNA(dna) {
  const map = {
    c: 'CG',
    g: 'GC',
    t: 'TA',
    a: 'AT',
  };

  return dna.split('').reduce((tmp, x) => {
    if (map[x].toLowerCase()) {
      tmp.push(map[x]);
    }

    return tmp;
  }, []);
}

2

A switch caseve bir forEachişlevi kullanmayı deneyebilirsiniz , şöyle:

function pairDNA(dna) {
  let pairs = [];

  dna.forEach( dnaValue => {
    switch (dnaValue.toLowerCase()) {
      case "c":
        pairs.push("CG");
        break;
      case "g":
        pairs.push("GC");
        break;
      case "t":
        pairs.push("TA");
        break;
      case "a":
        pairs.push("AT");
        break;
    }
  })

  return pairs;
}

1

Büyük dizenin denetimini kaldırmanıza olanak tanıyan dizeyi küçük harflerle yazabilirsiniz:

function pairDNA(dna) {
  dna = dna.toLowerCase();
  const pairs = []
  for (let i = 0; i < dna.length; i ++) {
   if (dna[i]=== "c") {
     pairs.push("CG");
   } else if (dna[i]dna[i] === "g") {
     pairs.push("GC");
   } else if (dna[i] === "t") {
     pairs.push("TA");
   } else if (dna[i] === "a") {
     pairs.push("AT");
   }
 }

 return p;
}

1
const lookup = {
    c: "CG", 
    g: "GC", 
    t: "TA", 
    a: "AT"
};

function pairDNA(dna) {  

  const pairs = [];

  for (let i = 0; i < dna.length; i ++) {
     pairs.push( lookup[dna[i].toLowerCase()] );
  }

  return pairs;

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.