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

如何从数组随机取元素并逐个添加至空数组直至原数组元素全移入?

解决方案

首先纠正你代码里的一个错误:原代码中使用的arr[indexNum1]应该改为arr1[indexNum1],因为你定义的数组变量是arr1。

下面提供两种实现思路,都能把arr1的所有元素随机移入newarr:

方法一:循环移除原数组元素

通过while循环持续从arr1中随机选取元素,加入newarr后从原数组删除该元素,直到原数组为空:

var arr1 = [90, true, "hello", 90, 78, 56, 45, 67, 34, "apple", "pinapple"];
let newarr = [];

// 当arr1还有元素时持续循环
while (arr1.length > 0) {
  // 生成当前arr1范围内的随机索引
  let indexNum1 = Math.floor(Math.random() * arr1.length);
  // 取出对应元素
  let getValue = arr1[indexNum1];
  // 加入新数组
  newarr.push(getValue);
  // 从原数组移除该元素,避免重复选取
  arr1.splice(indexNum1, 1);
}

console.log(newarr); // 输出包含所有原元素的随机排列结果

注意:这种方法会修改原数组arr1,循环结束后arr1会变为空数组。

方法二:Fisher-Yates洗牌算法(推荐)

这是业内常用的高效随机洗牌算法,无需修改原数组,直接生成原数组的随机排列版本:

var arr1 = [90, true, "hello", 90, 78, 56, 45, 67, 34, "apple", "pinapple"];
// 复制原数组,避免修改原始数据
let newarr = [...arr1];

// 从数组末尾向前遍历,逐个交换随机位置的元素
for (let i = newarr.length - 1; i > 0; i--) {
  const randomIndex = Math.floor(Math.random() * (i + 1));
  // 交换当前元素和随机位置的元素
  [newarr[i], newarr[randomIndex]] = [newarr[randomIndex], newarr[i]];
}

console.log(newarr); // 输出随机排列后的数组

这种方法性能更优,且能保留原数组的完整数据,更适合大多数场景。

内容的提问来源于stack exchange,提问作者Fumika0523

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:05:00