当前位置:首页 > 行业动态 > 正文

从数组中随机取x条不重复数据的JS代码

javascript,const arr = [1, 2, 3, 4, 5];,const x = 3;,const randomData = arr.sort(() => Math.random() 0.5).slice(0, x);,

在 JavaScript 中,从数组中随机取 x 条不重复数据是一个常见的需求,实现这一功能的方法有多种,本文将介绍几种常用的方法,并详细解释其原理和实现步骤。

方法一:使用Math.random()Array.prototype.filter()

这种方法利用Math.random() 生成随机数,并通过Array.prototype.filter() 筛选出不重复的数据。

function getRandomUniqueElements(arr, x) {
    const uniqueElements = new Set();
    while (uniqueElements.size < x) {
        const randomIndex = Math.floor(Math.random()  arr.length);
        uniqueElements.add(arr[randomIndex]);
    }
    return Array.from(uniqueElements);
}
// 示例用法
const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const x = 5;
const result = getRandomUniqueElements(array, x);
console.log(result);

解释:

1、创建 Set 对象uniqueElements 用于存储不重复的元素。

2、循环直到达到所需数量:使用while 循环,当uniqueElements 的大小小于x 时继续循环。

3、生成随机索引:通过Math.random() 生成一个介于 0 和数组长度之间的随机数,并将其转换为整数作为索引。

4、添加元素到 Set:将随机索引对应的数组元素添加到uniqueElements 中,由于 Set 自动去重,重复元素不会被添加。

5、转换为数组:使用Array.from() 将 Set 转换为数组并返回。

方法二:使用Array.prototype.sort()Array.prototype.slice()

这种方法先对数组进行洗牌(打乱顺序),然后截取前x 个元素。

function getRandomUniqueElements(arr, x) {
    if (x > arr.length) throw new Error("x cannot be greater than the array length");
    const shuffledArray = arr.sort(() => Math.random() 0.5);
    return shuffledArray.slice(0, x);
}
// 示例用法
const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const x = 5;
const result = getRandomUniqueElements(array, x);
console.log(result);

解释:

1、检查参数合法性:如果x 大于数组长度,抛出错误。

2、洗牌算法:使用Array.prototype.sort() 结合随机比较函数() => Math.random() 0.5 对数组进行洗牌。

3、截取前 x 个元素:使用Array.prototype.slice(0, x) 获取前x 个元素并返回。

方法三:使用递归和Array.prototype.splice()

这种方法通过递归地从数组中移除随机元素,直到获得所需数量的不重复数据。

function getRandomUniqueElements(arr, x) {
    if (x > arr.length) throw new Error("x cannot be greater than the array length");
    const result = [];
    while (result.length < x) {
        const randomIndex = Math.floor(Math.random()  arr.length);
        result.push(arr.splice(randomIndex, 1)[0]);
    }
    return result;
}
// 示例用法
const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const x = 5;
const result = getRandomUniqueElements(array, x);
console.log(result);

解释:

1、检查参数合法性:如果x 大于数组长度,抛出错误。

2、初始化结果数组:创建一个空数组result 用于存储随机选择的元素。

3、递归选择元素:在result 的长度小于x 时,循环执行以下操作:

生成随机索引randomIndex

使用Array.prototype.splice() 从原数组中移除该索引处的元素,并将其添加到result 中。

4、返回结果数组:当result 的长度达到x 时,返回result

性能比较

方法 时间复杂度 空间复杂度 适用场景
Math.random() +Set O(x) O(x) 适用于小到中等规模的数组
sort() +slice() O(n log n) O(1) 适用于需要保持原数组顺序的场景
递归 +splice() O(x^2) O(1) 适用于小规模数组或对性能要求不高的场景

相关问答FAQs

Q1: 如果数组中有重复元素,如何确保选取的 x 条数据是唯一的?

A1: 上述方法已经考虑了数组中可能存在重复元素的情况,使用Set 可以自动去重,而其他方法通过随机选择和移除元素的方式也能有效避免重复,这些方法都能保证选取的x 条数据是唯一的。

Q2: x 大于数组长度,如何处理?

A2: 在实际应用中,如果x 大于数组长度,通常意味着输入参数不合法,为了处理这种情况,可以在函数开始时进行检查,并抛出错误或返回适当的提示信息,可以在函数开头添加以下代码:

if (x > arr.length) {
    throw new Error("x cannot be greater than the array length");
}

这样,当x 大于数组长度时,程序会抛出一个错误,提醒用户输入参数不合法。