数组遍历异常及元素比较问题求助
让我来帮你拆解这两个问题的根源,然后一步步修正代码~
问题2:循环忽略原数组、返回索引而非年份的原因
你在测试循环时犯了两个核心错误:
- 混淆了循环索引和数组元素:你把
t处理成年份拆分后的数组,但循环里直接把索引值i存入数组,而不是取原数组arr[i]或t[i]对应的年份元素,自然会得到0、2、4这类索引数字,而非实际年份。 - 重复自增导致循环跳步:
for循环的条件里已经有i++,你又在push(i++)里再做一次自增,这会让每次循环i直接增加2,既跳过了一半元素,也让索引和元素完全不匹配。
举个例子:第一次循环i=0,push(i++)后i变成1,紧接着for循环的i++让i变成2;第二次循环i=2,push后i变成3,for循环的i++让i变成4;此时i等于数组长度4,进入第三次循环,push(4++)后i变成5,最终得到[0,2,4]。
修正后的测试代码
function nextHappyYear(arr){ var o = { happy: [], notHappy: [] }; for (var i = 0; i < arr.length; i++) { if (i%2 === 0) { o.happy.push(arr[i]); // 取原数组对应索引的元素 } else { o.notHappy.push(arr[i]); } } console.log(o.happy) return o; } nextHappyYear([1021, 1022, 1023, 1024]) // 现在返回 [1021, 1023],符合预期
问题1:快乐年判断逻辑错误的原因
同样是两个关键问题:
- 索引与元素混淆:你在
if条件里用i[0]、i[1],但i是循环索引(数字类型),不是t数组里拆分后的年份字符数组,应该用t[i]来获取当前年份的拆分结果。 - 判断逻辑不完整:你只检查了第一个数字和其他三个的重复情况,但没验证第二个与第三、第四个,以及第三个与第四个的重复。比如年份1213,第一个和第三个数字重复,你的逻辑会漏掉这个情况;1233这种最后两位重复的也无法检测。
修正后的快乐年判断函数
推荐用更简洁可靠的方式:把年份转成字符串后用Set去重,若去重后的长度和原字符串长度一致,说明所有数字都不重复。
function nextHappyYear(arr){ var o = { happy: [], notHappy: [] }; for (var i = 0; i < arr.length; i++) { const yearStr = arr[i].toString(); // Set自动去重,长度相等则无重复数字 const isHappy = new Set(yearStr).size === yearStr.length; if (isHappy) { o.happy.push(arr[i]); } else { o.notHappy.push(arr[i]); } } console.log(o); return o; } nextHappyYear([1021, 1022, 1023, 1024]) // 输出:{ happy: [1023, 1024], notHappy: [1021, 1022] },完全符合预期
如果坚持用逐个判断的方式,需要补全所有两两组合的检查:
function nextHappyYear(arr){ var o = { happy: [], notHappy: [] }; var t = arr.map(e => e.toString().split("")); for (var i = 0; i < t.length; i++) { const digits = t[i]; // 检查所有两两组合是否无重复 const isHappy = digits[0] !== digits[1] && digits[0] !== digits[2] && digits[0] !== digits[3] && digits[1] !== digits[2] && digits[1] !== digits[3] && digits[2] !== digits[3]; if (isHappy) { o.happy.push(arr[i]); } else { o.notHappy.push(arr[i]); } } console.log(o); return o; }
内容的提问来源于stack exchange,提问作者mike87




