为什么我的JS逐位平方拼接函数偶尔会对数字执行两次平方运算?
问题根因定位
- 你在遍历
intDigits数组的过程中直接修改原数组的元素值,同时使用indexOf(x)获取当前元素索引,indexOf永远返回数组中第一个匹配值的索引,当修改后的值和数组中未处理的元素值重复时,就会错误定位到已经处理过的元素,导致该位置被重复平方。
以你测试的squareDigits(24)为例,执行过程如下:
- 初始
intDigits = [2,4]- 第一次遍历拿到x=2,
indexOf(2)返回0,把索引0位置改成2²=4,数组变为[4,4]- 第二次遍历拿到x=4(数组的第二个元素),
indexOf(4)返回第一个匹配的索引0,把索引0位置的4改成4²=16,数组变为[16,4]- 最后拼接得到164,和预期的44不符,这就是你说的2被平方两次的原因。
修复方案
方案1:使用map直接生成处理后的数组(推荐)
function squareDigits(num){ return parseInt( (""+num).split("") .map(digit => parseInt(digit) ** 2) .join("") ); } console.log(squareDigits(24)); // 输出44,符合预期 console.log(squareDigits(3214)); // 输出94116,符合预期
方案2:如果要保留原遍历逻辑,通过索引遍历避免定位错误
function squareDigits(num){ let digits = (""+num).split(""); let intDigits = []; for (x of digits) { intDigits.push(parseInt(x)); } // 按索引遍历,不需要用indexOf动态定位 for (let i = 0; i < intDigits.length; i++) { intDigits[i] = intDigits[i] * intDigits[i]; } return parseInt(intDigits.join("")); }
内容的提问来源于stack exchange,提问作者Garrett Harty
相关产品推荐
相关产品推荐

