给定一个字符串,将每个单词的第一个字母移到每个单词的末尾,然后在每个单词的末尾添加“ ay”并返回一个新字符串-JavaScript

时间:2019-04-03 18:12:38

标签: javascript arrays string for-loop concatenation

到目前为止,我有:

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);。就是说:

  

TypeError:firstWord.unshift不是函数。

但是.unshift()is a function吗?为什么这样不起作用?

一旦我得到一个新单词,我应该能够将newWords组合成一个newString,尽管可能有比为每个单词创建新的for循环更有效的方法。

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 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:2)

您可以使用RegExp(regex101)和String.replace()。正则表达式捕获每个单词(实际上是非空格值的序列)的开头(第一个字母)和结尾(其他字母)。使用替换($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 :(得分:2)

一种更简单的方法是使用map()join()

注意:根据代码战示例,仅ay被添加到包含!的字母缩写的字符串中。因此,您应该使用test()测试array的元素是否为aplhabet。

通过代码战中的所有测试以获取以下解决方案。

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'));