Как поменять буквы местами?

Дана функция с аргументом(ТЕКСТ), надо в каждом слове Вторую букву поменять местами с последней буквой.

Я разбил текст на массив из слов, но как поменять буквы местами?

Мой код:

function encryptThis(text) {
  let textSplit = text.split(" ")

  return textSplit.map( el => el.replace(el[1], el.at(-1) ) )
}

Ответы (3 шт):

Автор решения: SwaD

Поменять местами вторую букву с последней в каждом слове можно так:

function encryptThis(text) {
  return text.split(" ").map(el => {
    const elArr = el.split(''); // получаем массив букв
    [elArr[1], elArr[elArr.length - 1]] = [elArr[elArr.length - 1],elArr[1]];
    return elArr.join(''); // Получаем строку
  });
}

console.log(encryptThis('Привет как дела'));

Разбиваем строку на массив, получаем массив строк
Далее каждое слово разбиваем по буквам в массив
Меняем элементы местами
Собираем буквы в слова(массив в строку превращаем)

→ Ссылка
Автор решения: Алексей Р

Через slice() - вырезаем нужные куски слов и склеиваем в нужном порядке

const encryptThis = text => text.split(" ").map(el => el.slice(0, 1) + el.slice(-1) + el.slice(2, -1) + el.slice(1, 2))
console.log(encryptThis('Привет как дела'))

→ Ссылка
Автор решения: EzioMercer
  1. Разбиваем текст на слова
  2. Разбиваем слова на буквы
  3. В каждом слове меняем 2-ой и последний элементы местами
  4. Объеденеям обратно буквы в слова
  5. Объеденяем обратно слова в текст

const encryptText = text => {
  const textSplitter = ' ';
  const wordSplitter = '';

  const words = text.split(textSplitter);
  
  const enycryptedWords = words.map(word => {
    const lettersOfWord = word.split(wordSplitter);
    const lastIndex = word.length - 1;

    const buf = lettersOfWord[1];
    lettersOfWord[1] = lettersOfWord[lastIndex];
    lettersOfWord[lastIndex] = buf;
    
    return lettersOfWord.join(wordSplitter);
  });
  
  const enycryptedText = enycryptedWords.join(textSplitter);

  return enycryptedText;
}

const input = document.querySelector('input');
const resultContainer = document.querySelector('.result');

input.addEventListener('input', e => {
  resultContainer.textContent = encryptText(e.target.value);
})
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

input,
.result {
  font-size: 2rem;
}
<input type="text" />
<div class="result"></div>

По сути своей моё решение не отличается от предыдущих, просто расписан чуть более подробно. Но тут я бы предложил небольшое улучшение: разбить логику шифрования текста и шифрования слова. Так код будет проще тестировать если вдруг понадобится:

const encryptWord = word => {
  const wordSplitter = '';

  const lettersOfWord = word.split(wordSplitter);
  const lastIndex = word.length - 1;

  const buf = lettersOfWord[1];
  lettersOfWord[1] = lettersOfWord[lastIndex];
  lettersOfWord[lastIndex] = buf;

  return lettersOfWord.join(wordSplitter);
}

const encryptText = text => {
  const textSplitter = ' ';

  const words = text.split(textSplitter);
  const enycryptedWords = words.map(encryptWord);
  const enycryptedText = enycryptedWords.join(textSplitter);

  return enycryptedText;
}

const input = document.querySelector('input');
const resultContainer = document.querySelector('.result');

input.addEventListener('input', e => {
  resultContainer.textContent = encryptText(e.target.value);
})
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

input,
.result {
  font-size: 2rem;
}
<input type="text" />
<div class="result"></div>

Звучит, всё хорошо, но лишь до тех пор пока мы можем делить предложение на слова используя пробел как разделитель. Попробуйте в input вставить знаки препинания, многоточия после слов или же что-то из этого списка кроме пробела. Вы увидете как программа начинает сразу работать неожиданно

Чтобы этого избежать я предлагаю другой метод с использованием replaceAll, у которого как второй аргумент может быть функция, которая на вход будет получать все нахождения (и не только):

  1. Теперь мы не разделяем текст, а ищем в нём слова, которые состоят только из букв (\p{L}) и имеют длину 3 и больше ({3,})
  2. Шаги для шифроания слова остались такими же (как видите разбитие большой функции на более мелкие имеет смысл):

const encryptWord = word => {  
  const wordSplitter = '';

  const lettersOfWord = word.split(wordSplitter);
  const lastIndex = word.length - 1;

  const buf = lettersOfWord[1];
  lettersOfWord[1] = lettersOfWord[lastIndex];
  lettersOfWord[lastIndex] = buf;

  return lettersOfWord.join(wordSplitter);
}

const encryptText = text => text.replaceAll(/\p{L}{3,}/gu, encryptWord);

const input = document.querySelector('input');
const resultContainer = document.querySelector('.result');

input.addEventListener('input', e => {
  resultContainer.textContent = encryptText(e.target.value);
})
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

input,
.result {
  font-size: 2rem;
}
<input type="text" />
<div class="result"></div>

P.S. Для лучшего понимания регулярного выражения, который я использую, рекомендую следующие статьи:

  1. RegExp.prototype.unicode
  2. Unicode character class escape: \p{...}, \P{...}
  3. Quantifier: *, +, ?, {n}, {n,}, {n,m}
→ Ссылка