Слияние в функции не меняет характер, как ожидалось - PullRequest
4 голосов
/ 21 января 2020

Я некоторое время работал над этой функцией, но не могу понять, почему, даже если я использую .splice (), я не получаю модифицированный массив. Я предоставляю индекс, с которого нужно начать изменять массив «i», количество элементов для удаления «1» и элемент для добавления «str [i]».

function wave(str) {
  let result = [];
  for (let i = 0; i < str.length; i++) {
    if ((/[a-z]/ig).test(str[i])) {
      let st = str.split("").splice(i, 1 , str[i].toUpperCase());
      result.push(st);
    }
  }
 return result;

}


console.log(wave('hello')); // expected ["Hello", "hEllo", "heLlo", "helLo", "hellO"];
console.log(wave("two words")); // ["Two words", "tWo words", "twO words", "two Words", "two wOrds", "two woRds", "two worDs", "two wordS"];

1 Ответ

8 голосов
/ 21 января 2020

Array#splice возвращает удаленные элементы. Вам нужно сохранить массив, удалить и добавить новый элемент.

Регулярное выражение не нужно заключать в скобки для доступа к методу RegExp#test.

Прежде чем нажать на массив, вам нужно взять Array#join для получения одной строки.

function wave(str) {
    let result = [];
    for (let i = 0; i < str.length; i++) {
        if (/[a-z]/ig.test(str[i])) {
            let st = str.split("");
            st.splice(i, 1, str[i].toUpperCase());
            result.push(st.join(''));
        }
    }
    return result;
}

console.log(wave('hello')); // expected ["Hello", "hEllo", "heLlo", "helLo", "hellO"];
console.log(wave("two words")); // ["Two words", "tWo words", "twO words", "two Words", "two wOrds", "two woRds", "two worDs", "two wordS"];
.as-console-wrapper { max-height: 100% !important; top: 0; }
...