如何仅用while循环通过纯ECMAScript 5将数组元素转为大写
解决仅用while循环实现数组元素转大写的问题
看起来你卡在了纯ES5环境下只用while循环完成字符串大写转换的需求上,我来帮你理清楚问题并给出正确的解法,先看看你原来思路里的问题,再一步步解决:
你现有代码的问题
- 你的
change对象里没有包含names数组中的元素(比如rob、dwayne这些),所以即使逻辑正确也无法匹配到目标值 - 循环嵌套逻辑混乱:
while循环放在了for循环外面,而且变量i的声明位置不对,导致while循环里访问i时会出现未预期的行为 - 数组赋值错误:
UpperCase = change.value[i];会直接覆盖整个UpperCase数组,而不是往里面添加元素 - 多余的嵌套遍历:
change是单层对象,内层的for (var prop in obj)完全没必要
正确解法(分两种场景)
场景1:允许使用字符串的toUpperCase方法(仅限制数组方法)
如果只是不能用数组的push、map等方法,但可以用字符串的内置转换方法,那这个解法最简单,只用一层while循环,通过数组索引直接赋值:
var names = ['rob', 'dwayne', 'james', 'larry', 'steve']; var UpperCase = []; var i = 0; // 外层while循环遍历names数组的每个元素 while (i < names.length) { // 转大写后通过索引存入UpperCase数组 UpperCase[i] = names[i].toUpperCase(); i++; } console.log(UpperCase); // 输出 ["ROB", "DWAYNE", "JAMES", "LARRY", "STEVE"]
场景2:完全不能使用任何内置方法(手动实现大写转换)
如果要求完全不能用任何方法(包括toUpperCase),那我们可以利用ASCII码来手动转换:小写字母a-z的ASCII码是97-122,对应的大写字母是65-90,每个小写字母的ASCII码减去32就得到大写,这时候需要嵌套while循环来遍历每个字符串的字符:
var names = ['rob', 'dwayne', 'james', 'larry', 'steve']; var UpperCase = []; var outerIndex = 0; // 外层while循环遍历names数组 while (outerIndex < names.length) { var currentName = names[outerIndex]; var upperName = ''; var innerIndex = 0; // 内层while循环遍历当前字符串的每个字符 while (innerIndex < currentName.length) { var charCode = currentName.charCodeAt(innerIndex); // 判断是否是小写字母,是则转大写 if (charCode >= 97 && charCode <= 122) { charCode -= 32; } // 把转换后的字符拼接到结果字符串 upperName += String.fromCharCode(charCode); innerIndex++; } // 把转换好的字符串存入结果数组 UpperCase[outerIndex] = upperName; outerIndex++; } console.log(UpperCase); // 输出 ["ROB", "DWAYNE", "JAMES", "LARRY", "STEVE"]
这两种解法都严格遵循了你的要求:仅使用while循环、纯ES5语法,没有使用数组的push、map等方法(场景1用了字符串的toUpperCase,场景2完全手动实现转换)。
内容的提问来源于stack exchange,提问作者Pepdbm 7
相关产品推荐
相关产品推荐

