Как получить нечетные и четные символы позиции из строки?

Убедитесь, что сценарий содержит

<?php

перед кодом, который должен быть выполнен. Между <? и php в этом не должно быть пробелов.

1
задан adiga 25 March 2019 в 17:35
поделиться

3 ответа

Вероятно, было бы проще использовать регулярное выражение и .replace: захватить два символа в отдельных группах захвата, добавить первый символ в строку и заменить вторым символом. Затем у вас будет первая половина нужного вам вывода в одной строке, а вторая в другой: просто объедините их вместе и верните:

function encrypt(text) {
  let removedText = '';
  const replacedText1 = text.replace(/(.)(.)?/g, (_, firstChar, secondChar) => {
    // in case the match was at the end of the string,
    // and the string has an odd number of characters:
    if (!secondChar) secondChar = '';
    // remove the firstChar from the string, while adding it to removedText:
    removedText += firstChar;
    return secondChar;
  });
  return replacedText1 + removedText;
}
console.log(encrypt('This is a test!'));
[112 ]

0
ответ дан CertainPerformance 25 March 2019 в 17:35
поделиться

Довольно просто с помощью .reduce() создать два массива, которые вам нужны.

function encrypt(text) {
  return text.split("")
             .reduce(({odd, even}, c, i) => 
                i % 2 ? {odd: [...odd, c], even} : {odd, even: [...even, c]}
             , {odd: [], even: []})
}

console.log(encrypt("This is a test!"));

Их можно преобразовать в строки, используя .join(""), если хотите.

0
ответ дан ziggy wiggy 25 March 2019 в 17:35
поделиться

Я думаю, вы были на правильном пути. То, что вы пропустили - замена, это либо строка, либо RegExp.

Метод replace () возвращает новую строку с некоторыми или всеми совпадениями шаблона, замененными заменой. Шаблон может быть строкой или RegExp, а замена может быть строкой или функцией, вызываемой для каждого совпадения. Если pattern является строкой, будет заменено только первое вхождение.

Источник: String.prototype.replace ()

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

Источник: Метод JavaScript String replace ()

Так что мое предложение будет продолжить с заменой и передать правильный RegExp в функцию, я думаю, вы можете понять из этого примера - это удаляет каждую секунду вхождения для char 't':

let count = 0;
let testString = 'test test test test';

console.log('original', testString);

// global modifier in RegExp
let result = testString.replace(/t/g, function (match) {
  count++;
  return (count % 2 === 0) ? '' : match;
});

console.log('removed', result);
[113 ]

0
ответ дан norbitrial 25 March 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: