关于使用扩展和字符串操作,foreach 循环的一点说明

Posted

技术标签:

【中文标题】关于使用扩展和字符串操作,foreach 循环的一点说明【英文标题】:a bit clarafication on using spread and string manipulation, foreach loop 【发布时间】:2020-05-19 15:42:45 【问题描述】:

所以我写了这个函数,我想把元音大写,每隔一个字母小写, 问题最终结果以相同的字符串结尾,我是新的传播和for-each, 在我传播一个字符串后它会变成一个数组吗? 当我操纵字母时,它是否应该通过操纵再次变成一个字符串,还是我需要加入它?为什么大写和小写函数不起作用?

功能:

function upperCase(str) 
  var vowels = "aeiou";
  [...str].forEach(letter => 
    if (vowels.includes(letter)) letter.toUpperCase();
    letter.toLowerCase();
  );
  console.log(str);

【问题讨论】:

永远不要使用forEach。请注意toUpperCase() 不会更改字符串(或字符),它会返回一个新字符串。所以建立一个新的字符串,你可以在最后return(或记录)。 "在我传播一个字符串后,它会变成一个数组吗?" - 是的,你是在一个数组文字中传播 Taplar,这是不正确的,开始 - 为什么我不应该使用 for-each?所以基本上我需要创建一个空字符串并添加到它?我无法将给定的字符串操作成别的东西? 是的,avoid foreach,use for...of 代替(然后你甚至不需要传播到一个数组中),或者 map 到一个新的数组,然后将 .join("") 字母返回到一个字符串。 【参考方案1】:

如果您只想操作一个字符串,您可能需要使用replace 函数

const newString = str.toLowerCase().replace(/[a,e,i,o,u]/g, letter => letter.toUpperCase())

这首先将所有内容都小写,然后将所有元音(匹配正则表达式)替换为大写版本。

【讨论】:

【参考方案2】:

你有几个问题:

    .toUpperCasetoLowerCase 返回新值,它们不会改变现有值(而且字符串无论如何都是不可变的) 即使他们确实改变了现有值,他们也会改变数组中的字母字符串而不是原始字符串 你没有使用elsetoLowerCase 总是运行

你需要:

    return一个值 使用map 收集值 使用join() 将数组转回字符串

这样的:

function upperCase(str) 
  const vowels = "aeiou";
  const result = 
      [...str]
          .map(
              letter => 
                  (vowels.includes(letter)) 
                  ? letter.toUpperCase() 
                  : letter.toLowerCase()
           ).join("");
  console.log(result);


upperCase("The quick brown fox jumps over the lazy dog");

【讨论】:

【参考方案3】:

您需要将 foreach 的结果分配给某物。

function upperCase(str) 
  var vowels = "aeiou";
  [...str].forEach(letter => 
    if (vowels.includes(letter)) letter.toUpperCase();
    letter.toLowerCase();
  );
  console.log(str);

[...str] 正在创建一个数组,循环它,执行一个动作,但最后没有将结果数组保存到任何变量中。您还缺少 else 和/或 return。我认为在这种情况下,地图也更有意义。

function upperCase(str) 
  var vowels = "aeiou";
  const result = [...str].map(letter => 
    if (vowels.includes(letter)) return letter.toUpperCase();
   return letter.toLowerCase();
  );
  console.log(result);

【讨论】:

所以不可能用 foreach 循环保存?我需要使用地图创建一个新数组来保存吗?谢谢 @AntiMatter foreach 可以操作原始数组。两者都可以使用,但通常在对数组执行操作时,您希望返回一个新的数组引用。这取决于,两者都有用例。在这种情况下,我只是觉得 .map 更符合您的要求。正如上面评论中所说,您可能希望 .join("") 在 .map 的末尾 codeburst.io/javascript-map-vs-foreach-f38111822c0f我觉得这篇文章很好地解释了不同的用途。

以上是关于关于使用扩展和字符串操作,foreach 循环的一点说明的主要内容,如果未能解决你的问题,请参考以下文章

关于[JS] forEach循环return无法跳出的踩坑和解决方案

关于“foreach循环”中遇到的几个问题总结

关于C#中遍历字符串中的每个字符的方法

为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作?

为什么阿里禁止在 foreach 循环里进行元素的 remove/add 操作

Java初学者:for each循环