js перебор и замена символов в строке, избавиться от for и многоуровневых if else

Рейтинг: 0Ответов: 3Опубликовано: 18.08.2023

я написал вот такой чудесный алгоритм, простите за слово алгоритм, оно здесь вряд ли применимо

if (reverse_copied_sequence && vector_specific_trailer) {
  let mirrorReflection = '';
  const vector_specific_trailerUpper =
    vector_specific_trailer.toUpperCase();
  for (let i = 0; i < vector_specific_trailerUpper.length; i += 1) {
    if (vector_specific_trailerUpper[i] === 'G') {
      mirrorReflection += 'C';
    } else if (vector_specific_trailerUpper[i] === 'C') {
      mirrorReflection += 'G';
    } else if (vector_specific_trailerUpper[i] === 'A') {
      mirrorReflection += 'T';
    } else if (vector_specific_trailerUpper[i] === 'T') {
      mirrorReflection += 'A';
    }
  }
  console.log('mirrorReflection: ', mirrorReflection);
}

у меня есть исходная строка, я пробегаюсь по ней и буквы А заменяю на Т, а буквы G заменяю на С, так вот, это отлично работает в цикле фор, но я подозреваю, что получу по шапке за все эти if-ы, вы же и сами знаете как народ их не любит! Можете предложить решение, чтобы приукрасить код, перебирать все буквы и менять, как в моих "ифах"

Ответы

▲ 1Принят

Без if

test('acfdtaVBCAS')
//
function test(vector_specific_trailer) {
  const def = {
    G: 'C',
    C: 'G',
    A: 'T',
    T: 'A'
  }
  let mirrorReflection = '';
  const vector_specific_trailerUpper = vector_specific_trailer.toUpperCase();
  for (let i = 0; i < vector_specific_trailerUpper.length; i++) {
     mirrorReflection += def[vector_specific_trailerUpper[i]] ?? '';
  }
  console.log('mirrorReflection: ', mirrorReflection);
}

Типа "без циклов"...

test('acfdtaVBCAS')
//
function test(str) {
  const def = {
    G: 'C',
    C: 'G',
    A: 'T',
    T: 'A'
  }
  const re = new RegExp(`[${Object.keys(def).join('')}]`, 'ig')
  str = str.match(re).map(v => def[v.toUpperCase()]).join('')
  console.log(str);
}

▲ 3

Словарь примерно такой let dict = {"A": "T", "T": "A" итд} и заменять в одной строчке:

 mirrorReflection += dict[vector_specific_trailerUpper[i]]
▲ 0

Обещанный «однострочник»:

const mapping = {
  A: 'T',
  C: 'G',
  G: 'C',
  T: 'A',
};

const mirrorReflection = vector_specific_trailer
  .toUpperCase()
  .replace(/./g, (c) => (mapping[c] || ''));

Документация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace