Получив строку, переместите первую букву каждого слова в конец каждого слова, затем добавьте «ay» в конец каждого слова и верните новую строку - JavaScript - PullRequest
0 голосов
/ 03 апреля 2019

Пока у меня есть:

function pigIt(str) {

  //split string into array of words
  let words = str.split(" ");

  //loop through array of words
  for (let i = 0; i < words.length; i++) {

    //loop through individual words
    for (let j = 0; j < words.length; j++) {

      //get first word in words
      let firstWord = words[0];

      //get first character in first word
      let firstChar = firstWord[0];

      //Create new word without first character
      let unshiftedWord = firstWord.unshift(0);

      //move first character to the end
      let newWord = unshiftedWord.push(firstChar) + "ay";

      return newWord;

    }
  }
}

console.log(pigIt('Pig latin is cool'));

Пока я просто хотел бы вернуть "igPay".Затем я объединю строки, чтобы сформировать новую строку.

Но это не нравится firstWord.unshift(0);.Он говорит:

Ошибка типа: firstWord.unshift не является функцией.

Но .unshift () является функцией ?Почему это не работает?

Как только я смогу получить новое слово, я смогу объединить newWords в newString, хотя, возможно, есть более эффективный способ, чем создание новогопетли для каждого отдельного слова.

https://www.codewars.com/kata/520b9d2ad5c005041100000f/train/javascript

РЕДАКТИРОВАТЬ : Я хочу написать эту функцию с традиционным объявлением функции, а не с обозначением стрелки.

РЕДАКТИРОВАТЬ 2 После реализации кода @Ori Drori моя функция выглядит следующим образом:

function pigIt(str) { 

  newString = str.replace(/(\S)(\S+)/g, '$2$1ay');
  return newString;
}

console.log(pigIt('Pig latin is cool'));

И это работает - но я не понимаю, что именно делает str.replace(/(\S)(\S+)/g, '$2$1ay');.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Вы можете использовать RegExp ( regex101 ) и String.replace().Регулярное выражение ловит голову (1-ую букву) и хвост (другие буквы) каждого слова (фактически последовательность непробельных значений).Используйте замену ($2$1ay), чтобы перестроить слово на латинском.

const pigIt = (str) => str.replace(/(\w)(\w+)/g, '$2$1ay')

console.log(pigIt('Pig latin is cool'));

Как работает замена:

  • Регулярное выражение собирает первый символ слова (\w) и присваивает его $1
  • Регулярное выражение собирает остальные символы слова и присваивает им $2
  • Замена определяет, что новая строка будет $ 2, затем $ 1, а затем "ay"

Примечание. Я использовал \S для перехвата всех непробельных символов.

2 голосов
/ 03 апреля 2019

Более простой способ - использовать map() и join().

Примечание : что в соответствии с примером кодовых войн только ay добавляется в строку, содержащую аргументы, а не !. Поэтому вы должны проверить, является ли элемент массива aplhabet или нет, используя test().

Все тесты в кодовых войнах пройдены для следующего решения.

function pigIt(str){
  return str.split(' ').map(x =>/[a-zA-Z]+/.test(x) ? x.slice(1)+x[0]+'ay' : x).join(' ');
}
console.log(pigIt('Pig latin is cool'));

Без функции стрелки.

function pigIt(str){
  return str.split(' ').map(function(x){ 
      return /[a-zA-Z]+/.test(x) ? x.slice(1)+x[0]+'ay' : x;
  }).join(' ');
}
console.log(pigIt('Pig latin is cool'));

Простой for цикл

Вот код, использующий простой цикл for

function pigIt(str){
  str = str.split(' ');
  for(let i = 0;i<str.length;i++){
    if(/[a-zA-Z]/.test(str[i])){
      str[i] = str[i].slice(1) + str[i][0] + 'ay';
    } 

  }
  return str.join(' ');
}
console.log(pigIt('Pig latin is cool'));
2 голосов
/ 03 апреля 2019

unshift в методе, не относящемся к строке

Вы можете просто разделить пространство, затем сопоставить и поменять местами, добавить ay и снова объединить их с пробелом.

let str = `Pig latin is cool`

let op = str.split(' ').map(e=>  e.substr(1,) +e[0] + 'ay').join(' ')

console.log(op)

Без функции стрелки

let str = `Pig latin is cool`

let op = str.split(' ').map(function(e){
  return  e.substr(1,) +e[0] + 'ay'
}).join(' ')

console.log(op)
...