Как заменить определенные символы в строке в JavaScript? - PullRequest
0 голосов
/ 02 октября 2018

Учитывая строку типа aaabba, я хочу функцию, которая превращает а в б и б в а , возвращая bbbaab.

Я попробовал этот неуклюжий:

var newa = [];
function swit(x) { 
    for (var i = 0; i < x.length; i++) {
        if (x[i] === 'a') {
            newa.push('b');
        } 
        else if (x[i] === 'b') {
            newa.push('a');
        } 
        alert(newa);
    }
}
swit("aaab");

После нажатия множества предупреждений, наконец, последнее предупреждение показывает ожидаемый результат.Но я хочу это без запятых и в первую очередь - не после многих итераций:

enter image description here

Я также попробовал метод string.replace() - в сочетании сfor -loop:

function swit(x) { 
    for (var i = 0; i < x.length; i++) {
        if (x[i] === 'a') {
            x.replace('a', 'b');
        } 
        else if (x[i] === 'b') {
            x.replace('b', 'a');
        } 
        alert(x);
    }
}
swit("aaab");

Но ничего не меняется.Почему?

Не могли бы вы дать мне подсказку, что пошло не так и как получить желаемый результат?

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

Вам нужно переместить строку оповещения из цикла for до конца и использовать Array.join () , чтобы преобразовать newa в строку без запятых.

Также имеет смысл переместить объявление массива newa в функцию swit.

Наконец, вы должны рассмотреть также добавление условия else, когда вы просто помещаете точно такой же текущий символ в массив newa, если это не a или b, поэтому длина выходной строки равнатакой же, как исходная строка.

function swit(x) { 
  var newa = [];
  for (var i = 0; i < x.length; i++) {
    if (x[i] === 'a') {
      newa.push('b');
    } else if (x[i] === 'b') {
      newa.push('a');
    } else {
      newa.push(x[i])
    }
  }
  alert(newa.join(""));
}

swit("aaab");
swit("aasdfcvbab");
0 голосов
/ 02 октября 2018

Самый простой способ - разделить текст на отдельные символы, используя split, а затем сопоставить массив символов, просто заменив a => b и b => a и join вместе, либо просто используйте replace

'bbbaab'.split('').map(char => char === 'a' ? 'b' : 'a').join('');

'bbbaab'.replace(/a|b/g, (match) => match === 'a' ? 'b' : 'a');

function swap(str) {
  return str.split('').map(char => char === 'a' ? 'b' : 'a').join('');
}
function swap2(str) {
  return str.replace(/a|b/g, (match) => match === 'a' ? 'b' : 'a');
}

console.log(swap('bbbaab'));
console.log(swap2('bbbaab'));
0 голосов
/ 02 октября 2018
var str = "aaab";
str = str.replace(/a|b/g, v => {
       if(v=="a"){
         return "b"
       }else{
         return "a"
       }
    });

console.log(str);
0 голосов
/ 02 октября 2018

Ваш первый пример работает, но заменяет строку массивом символов (который отличается от строки).Вы можете просто join результирующий массив получить желаемый результат:

function swit(x) {
    var newa = [];

    for (var i = 0; i < x.length; i++) {
        if (x[i] === 'a') {
            newa.push('b');
        } else if (x[i] === 'b') {
            newa.push('a');
        }
    }

    var arrayJoined = newa.join('');
    alert(arrayJoined);
    return arrayJoined;
}

Для вашего второго примера replace заменяет все вхождения в строке и не требует запуска в цикле for.Итак, что вы на самом деле делаете во втором примере кода: for each character in string: if character is 'a', replace by b. if character is 'b', replace by a.Который в основном просто переключает все a на b и b обратно на a.В результате получается та же строка вывода, что и для входной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...