【问题标题】:Add space to string when it includes word in array当字符串包含数组中的单词时向字符串添加空格
【发布时间】:2019-03-04 20:14:12
【问题描述】:

我有一个函数,我正在遍历给定的字符串,交替每个字符的大小写并将其连接到变量alt

为了正确循环,我从原始字符串中删除了空格。但我需要在函数末尾添加它们。

function alternatingCaps(str) { // 'hello world'
  let words = str.toLowerCase().split(' '); // ['hello','world']
  str       = words.join(''); // 'helloworld'
  let alt = '';
  for(let i = 0; i < str.length; i++) {
    if(i % 2 === 0)
      alt += str[i].toUpperCase();
    else
      alt += str[i].toLowerCase();
  }
  return alt;
} 

console.log(alternatingCaps('hello world'));
/* Output: "HeLlOwOrLd"
   Wanted output: "HeLlO wOrLd" */

一旦alt 包含作为值包含在words 数组中的字符串,我想在单词的末尾添加一个空格。

这是我的尝试:

 words.forEach(function(word) {
  if(alt.toLowerCase().includes(word) && word[word.length - 1] === alt[i].toLowerCase())
    alt += ' ';
});

它检查words 数组中的任何单词是否存在于alt 字符串中,以及字符串的当前字符迭代是否对应于单词中的最后一个字母。如果是这样,它会在字符串中添加一个空格。

但这并没有按预期工作。

> Output: "HeLlO wOr Ld"
> Wanted output: "HeLlO wOrLd"

我也想这会导致重复字母的问题。我怎样才能实现我的目标?

【问题讨论】:

标签: javascript arrays string for-loop


【解决方案1】:

你不应该加入你的话。将它们作为单独的元素保存在 words 数组中,然后您可以循环遍历该数组,将您的函数应用于每个元素。

function alternatingCaps(str) { // 'hello world'
  let words = str.toLowerCase().split(' '); // ['hello','world']

  const alts = words.map(word => capitalizeEvens(word));
  return alts.join(' ');

  function capitalizeEvens(word) {
    let alt = '';
    for(let i = 0; i < word.length; i++) {
      if(i % 2 === 0)
        alt += word[i].toUpperCase();
      else
        alt += word[i].toLowerCase();
    }
    return alt;
  } 

console.log(alternatingCaps('hello world'));

【讨论】:

  • 考虑到capitalizeEvens 包含对str 而不是word 的引用,不确定这是否可行...
  • 我没有这样做,因为它会导致交替刷新每个单词;我希望它是连续的。例如,此代码将输出 HeLlO WoRlD 而不是 HeLlO wOrLd
【解决方案2】:

您可以一次遍历一个字符的字符串。然后,检查字符是否是实际的单词字符。如果是,则替换大写,如果不是,则按原样将其添加到输出中:

function altCaps(input) {
  var result = '';
  var cap = false;
  for (var i = 0; i < input.length; i++) {
    var c = input[i];
    result += /\w/.test(c) ? (cap = !cap) ? c.toUpperCase() : c.toLowerCase() : c;
  }
  return result;
}

更新:清晰的代码

function altCaps(input) {
  var result = '';
  var cap = false;
  for (var i = 0; i < input.length; i++) {
    var c = input[i];
    if (/\w/.test(c)) {               // check if char is a "word character" (i.e. letter)
      cap = !cap;                     // toggle next capitalization
      if (cap)                        // if it should capitalize
        result += c.toUpperCase();    // add uppercase letter
      else
        result +=  : c.toLowerCase(); // add lowercase letter
    } else {
      result += c;                    // no letter, so add character as is.
    }
  }
  return result;
}

【讨论】:

  • 我是 Javascript 新手,在使用多个三元运算符时遇到了困难。你能解释一下它是如何工作的吗?
  • 当然,请参阅我的更新。基本上,您必须将三元运算符视为一个简单的内联“if-then-else”构造。更难理解的部分是将作业作为条件的一部分。在 Javascript 中,即使是赋值也会产生一个返回值,该值的计算结果是分配的值。因此它可以立即在条件中使用。
猜你喜欢
  • 1970-01-01
  • 2012-06-28
  • 2013-12-21
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多