生成10个随机数拆分至两个数组时首元素丢失问题求助
问题分析
你遇到的第一个元素丢失问题,根源是错误地用sort()方法来做数组拆分——sort()的设计用途是排序,完全不是用来遍历处理元素的。
你的sort()回调只接收了一个参数(正确应该是两个参数a和b),而且没有返回排序所需的数值(-1/0/1),这会导致JS引擎的排序逻辑出现异常,部分元素(比如第一个)不会被回调函数处理,自然就没被推入目标数组。
正确解决方案
直接用数组遍历方法来拆分,这里给几种常用写法:
方法1:forEach遍历(最直观)
const arr = Array(10) .fill() .map(() => Math.round(Math.random() * 100)); console.log(arr); let arr1 = []; let arr2 = []; // 直接遍历每个元素,判断后推入对应数组 arr.forEach(num => { if (num < 50) { arr1.push(num); } else { arr2.push(num); } }); document.getElementById("arrPrint").innerHTML = JSON.stringify(arr1); document.getElementById("arrPrint2").innerHTML = JSON.stringify(arr2);
方法2:filter拆分(更简洁)
如果不需要保留原数组的遍历过程,用filter更优雅:
const arr = Array(10) .fill() .map(() => Math.round(Math.random() * 100)); console.log(arr); // 筛选出小于50的元素 const arr1 = arr.filter(num => num < 50); // 筛选出大于等于50的元素 const arr2 = arr.filter(num => num >= 50); document.getElementById("arrPrint").innerHTML = JSON.stringify(arr1); document.getElementById("arrPrint2").innerHTML = JSON.stringify(arr2);
方法3:reduce一次性拆分(性能更优)
如果追求性能,用reduce只遍历原数组一次就完成拆分:
const arr = Array(10) .fill() .map(() => Math.round(Math.random() * 100)); console.log(arr); // reduce返回包含两个数组的对象 const { arr1, arr2 } = arr.reduce((acc, num) => { if (num < 50) { acc.arr1.push(num); } else { acc.arr2.push(num); } return acc; }, { arr1: [], arr2: [] }); document.getElementById("arrPrint").innerHTML = JSON.stringify(arr1); document.getElementById("arrPrint2").innerHTML = JSON.stringify(arr2);
关键提醒
永远不要用sort()来做遍历处理,它的设计目的是排序,滥用会导致不可预测的行为,不仅可能丢失元素,还会浪费性能(排序的时间复杂度是O(n log n),而遍历拆分仅为O(n))。
内容的提问来源于stack exchange,提问作者Hector
相关产品推荐
相关产品推荐

