Попытка вернуть новую строку с заменой некоторых символов другими символами

#javascript #typescript

#javascript #машинописный текст

Вопрос:

Я изучаю TypeScript, и для этой конкретной проблемы я пытаюсь заменить определенные символы в строке другим символом. Поэтому, если есть буква «А», я хочу заменить ее буквой «Т». Если есть T, я хочу заменить его на A. Если есть буква C, я хочу заменить ее буквой G. Если есть буква G, я хочу заменить ее на букву C.

Мне был дан следующий начальный код для работы:

   export class Kata {
      static dnaStrand(dna: string) {
        //your code here
      }
    }
 

Выходные данные должны быть такими:

 dnaStrand("ATTGC") // return "TAACG"
    
dnaStrand("GTAT") // return "CATA"
 

Итак, моей первоначальной мыслью было использовать цикл for для перебора строки и возврата новой строки, где символы, о которых я упоминал выше, были бы заменены другими символами (также упомянутыми выше). Когда я запускаю код в jsfiddle, я получаю следующее сообщение об ошибке: Unexpected token 'export' . Кто-нибудь может мне помочь? Я подумал, что если бы я хотел вернуть новую строку, мне пришлось бы перебирать строку и заменять символы, связывая методы replace вместе. Был ли это лучший подход?

 export class Kata {
  static dnaStrand(dna: string) {
    for (let i = 0; i < dna.length; i  ){
        dna = dna.replace('A','T').replace('T', 'A').replace('C', 'G').replace('G', 'C');
    }
    return dna;
  }
}

Kata.dnaStrand("ATTGC"); 
 

Комментарии:

1. Почему вы пытаетесь использовать export ?

2. @iota Вот как мне был задан вопрос. Разве это не должно идти туда?

3. Проблема экспорта будет зависеть от вашей среды. Версия typescript, вероятно, является более старой версией, которая еще не поддерживает новый синтаксис экспорта. Для целей тестирования вы должны быть в порядке, просто удалите место, где указано export, но не забудьте вставить его обратно, если вам нужно отправить свою работу

Ответ №1:

Ваш подход к замене символов на данный момент фактически не будет работать.

Способ работы функции replace выглядит следующим образом:

replace(strMatch, strReplace) создаст новую строку из вашей старой строки со всеми экземплярами strMatch replaced by strReplace и вернет ее. (Дополнительная информация по этой ссылке: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace )

То, что у вас есть на данный момент, не будет корректно работать в вашем экземпляре по 2 причинам

  1. Если функция replace вызывается в цикле for, это означает, что замена будет выполняться во время ввода строки dna.length . На самом деле вы хотели бы, чтобы это было сделано только один раз
  2. Подобное объединение нескольких замен контрпродуктивно. Глядя на первые 2 вызова replace: первый заменяет все ваши экземпляры A with T , оставляя вас с TTTGC . Затем второй заменяет все ваши экземпляры T with A , оставляя вас с AAAGC и так далее. Обратите внимание, что каждая цепочка функции replace вызывается для новой строки, а не для вашей исходной.

Одним из способов выполнения этой задачи было бы перебирать строку массива (как вы уже делаете), но вместо вызова функции replace вы просто хотите добавить к строке значение для соответствующей замены dna[i] .

Вероятно, в конечном итоге я бы сделал что-то подобное (но есть всевозможные способы, которыми вы могли бы это сделать! Это определенно не лучшее решение)

 static dnaStrand(dna: string): string {
  let newDna: string = '';
  const map: Record<string, string> = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'};
  for (let i = 0; i < dna.length; i  ){
    newDna  = map[dna[i]]; 
  }

  return newDna;
}