本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
平常接触的需求都是怎么去排序,将数组从无序变成有序。这次不一样,某个项目的需求是把现有的数据顺序打乱,用于创建出各种不同的随机顺序,以达到多样性的目的。头一次看见这种需求,以前还真没考虑怎么去打乱,一时有点茫然,后来仔细一想,其实难度也不大。
随机互换位置
对整个数组进行遍历,每次随机寻找一个其他元素进行交换;取随机索引时,必须使用Math.floor向下进行取整,才不会超出取值范围;如果取到的索引与当前遍历的索引相同,则不进行交换操作;每个元素都执行以上操作,直到整个数组遍历完成:
const list = [1,2,3,4,5,6,7,8]
for (let i = 0, len = list.length; i < len; i++) {
const randomIndex= Math.floor(Math.random() * len)
if (randomIndex === i) {
continue
}
// 交换两个位置的值
list[i] = [list[randomIndex], list[randomIndex] = list[i]][0]
}
console.log('list:', list)
// 输出list: (8) [1, 4, 7, 8, 6, 5, 3, 2]
可以看到,通过交换位置之后,list中大部分元素的位置都发生了改变。
随机取值放入新数组
每次都随机从原有的数组取出一个元素,按照顺序放入新的数组中,将所有元素取出时,可以得到一个拥有新顺序的数组:
const list = [1,2,3,4,5,6,7,8]
const newList = []
for (let i = 0, len = list.length; i < len; i++) {
const randomIndex = Math.floor(Math.random() * list.length)
newList[i] = list[randomIndex]
// 被取出的元素从原数组中删除
list.splice(randomIndex, 1)
}
console.log('newList:', newList)
// 输出newList: (8) [5, 8, 6, 3, 1, 4, 7, 2]
Array.sort
Array.sort()就是数组自带的排序函数,该方法比较两个值时,将值发送给比较函数,根据返回的(负、零、正)值对值进行排序。
那么,只要比较函数每次都随机返回一个(负、零、正)值,就可以达到打乱数组的效果:
const list = [1,2,3,4,5,6,7,8]
list.sort(() => Math.random() - 0.5)
console.log('list:', list)
// 输出list: (8) [4, 2, 6, 7, 1, 3, 8, 5]
总结
上面记叙的方法,都有一个共同的思路:对原有数组进行遍历,利用Math.random()获取随机数,根据随机数的不同,生成随机的结果。