如何从数组随机取元素并逐个添加至空数组直至原数组元素全移入?
解决方案
首先纠正你代码里的一个错误:原代码中使用的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
相关产品推荐
相关产品推荐

