You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:40:47