如何从长度为2624的Myjson数组中获取20个随机条目?
从长度为2624的JSON数组中获取20个随机条目
根据你的需求,分两种场景给出解决方案:
场景1:获取连续的20个随机条目
如果需要的是数组中某一段连续的20个元素,只需要先确定一个合法的起始索引,再直接计算结束索引即可(保证两者差值为20):
// 计算合法的起始索引:范围是0到数组长度-20,避免越界 const startIndex = Math.floor(Math.random() * (Myjson.length - 20)); // 结束索引 = 起始索引 + 20,slice左闭右开,刚好取20个元素 const endIndex = startIndex + 20; {Myjson.slice(startIndex, endIndex).map((item) => ( <Link href={item.ud} key={item.id} > {item.test} </Link> ))}
注意:数组索引从0开始,你之前代码里的+1会导致可能取到超出数组范围的索引(比如当Math.random()接近1时,xxx会变成2624,而数组最大索引是2623),所以要去掉这个+1,同时限制起始索引的最大值为数组长度-20,确保endIndex不会超出数组边界。
场景2:获取不重复的20个随机分散条目
如果需要从整个数组中随机挑选20个不连续、不重复的元素,可以用以下两种方法:
方法1:Fisher-Yates洗牌法(高效且无重复)
先对数组进行洗牌,再取前20个元素:
// 复制原数组避免修改原数据 const shuffled = [...Myjson]; // Fisher-Yates洗牌算法 for (let i = shuffled.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; } // 取前20个 const random20 = shuffled.slice(0, 20); {random20.map((item) => ( <Link href={item.ud} key={item.id} > {item.test} </Link> ))}
方法2:随机索引去重法
通过生成随机索引并去重,直到凑够20个:
const randomIndexes = new Set(); // 生成20个不重复的随机索引 while (randomIndexes.size < 20) { const index = Math.floor(Math.random() * Myjson.length); randomIndexes.add(index); } // 根据索引获取对应元素 const random20 = [...randomIndexes].map(idx => Myjson[idx]); {random20.map((item) => ( <Link href={item.ud} key={item.id} > {item.test} </Link> ))}
内容的提问来源于stack exchange,提问作者a3egd
相关产品推荐
相关产品推荐

