【问题标题】:upperCase even characters and lowerCase odd characters in each element of an array in JavaScriptJavaScript中数组的每个元素中的大写偶数字符和小写奇数字符
【发布时间】:2018-12-07 19:19:05
【问题描述】:

我需要在数组的每个元素中大写偶数字符和小写奇数字符,以便输入“This is a test”输出将是“ThIs Is A TeSt”(不包括空格,以便每个单词以大写字母)。

到目前为止,这是我想出的:

function toWeirdCase(string) {
  var reg = /\b(?![\s.])/
  var res = string.split(reg)
  var newArr = []

  for (let k = 0; k < res.length; k++) {
    for (let j = 0; j < res[k].length; j++) {
      if (j % 2 == 0) {
        res[k].charAt(j).toUpperCase()
      } else {
        res[k].charAt(j).toLowerCase()
      }
    }
    newArr.push(res[k])
  }
  return newArr.join('')
}

console.log(toWeirdCase('This is a test'))

它没有按预期工作,由于缺乏经验,我无法判断缺少什么。你能帮我解决这个问题吗?谢谢你。

【问题讨论】:

标签: javascript arrays loops sorting


【解决方案1】:

高尔夫球手版:

input
  .split(/\s+/)
  .map(wrd => wrd
    .split('')
    .map((c, i) => i % 2 ? c.toLowerCase() : c.toUpperCase())
    .join(''))
  .join(' ');

如果你不关心行长,那就是单行。

【讨论】:

  • 谢谢你,杰瑞德!
【解决方案2】:

toUpperCase 不会就地修改字符串(JavaScript 字符串是不可变的)。您需要将结果分配回一个变量。

function toWeirdCase(string) {
  var reg = /\b(?![\s.])/
  var res = string.split(reg)
  var newArr = []

  for (let k = 0; k < res.length; k++) {
    let newString = "";
    for (let j = 0; j < res[k].length; j++) {
      if (j % 2 == 0) {
        newString += res[k].charAt(j).toUpperCase()
      } else {
        newString += res[k].charAt(j).toLowerCase()
      }
    }
    newArr.push(newString)
  }
  return newArr.join('')
}

console.log(toWeirdCase('This is a test'))

【讨论】:

  • 谢谢,巴尔玛!现在我明白我错过了什么,非常感谢!
【解决方案3】:

我们可以使用基本映射来实现,然后使用模块来选择大写/小写奇/偶值

  1. 拆分每个单词
  2. 拆分每个单词中的每个字母
    1. 在单词而不是句子上使用模数
  3. 将单词重新组合在一起
  4. 将句子重新组合在一起

function toWeirdCase(str){
  return str.split(' ').map(word =>
    word.split('').map((itm, idx) => idx % 2 ? itm.toLowerCase() : itm.toUpperCase()).join('')
  ).join(' ')
}

console.log(toWeirdCase('This is a test'))

【讨论】:

    【解决方案4】:

    您可以使用String.replace() 和外部变量来决定文本是大写还是小写:

    function toWeirdCase(string) {
      let uppercase = true;
      return string
        .replace(/./g, c => {
          const current = uppercase;
          
          uppercase = c === ' ' ? true : !uppercase;
        
          return current ? c.toUpperCase() : c.toLowerCase();
        });
    }
    
    console.log(toWeirdCase('This is a test'))

    【讨论】:

      【解决方案5】:

      你可以试试这个

      let str = "This is a test";
      
      let op = str.split(' ').map((a,i)=>a.split('').map((e,i)=>i%2==0 ? e.toUpperCase() : e.toLowerCase()).join('')).join(' ');
      
      console.log(op)

      【讨论】:

      • 这不会产生预期的结果。
      【解决方案6】:

      您可以使用Array.mapString.splitString.join 来获得该结果。 映射单词,然后遍历每个字符,如果大写,则小写。

      const up = string => 
        string.split(' ')
        .map(word => word.split('')
          .map((chr, i) => chr[i%2 ? 'toLowerCase' : 'toUpperCase']()).join('')
        ).join(' ')
      
      console.log(up('This is a test'))

      你也可以只用一个Array.mapArray.reduce来解决:

      const chg = wrd => wrd.split('').map((c,i) => c[i%2 ? 'toLowerCase' : 'toUpperCase']()).join('')
      const up = str => str.split(' ').reduce((r,c) => r.concat(' ', chg(c)), '')
      
      console.log(up('This is a test'))

      【讨论】:

      • 谢谢你,Akrion!我一定会尝试使用 .map() 再次解决它。
      【解决方案7】:

      你可以使用一个简单的地图函数来做到这一点:

      "This is a test"
         .split("")
         .map((s, i) => (i % 2 == 0 ? s.toUpperCase() : s))
         .join("");
      

      Array.prototype.map()

      【讨论】:

        猜你喜欢
        • 2017-05-18
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        相关资源
        最近更新 更多