关于使用扩展和字符串操作,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】:你有几个问题:
.toUpperCase
和 toLowerCase
返回新值,它们不会改变现有值(而且字符串无论如何都是不可变的)
即使他们确实改变了现有值,他们也会改变数组中的字母字符串而不是原始字符串
你没有使用else
到toLowerCase
总是运行
你需要:
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无法跳出的踩坑和解决方案
为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作?