JavaScript中的蝴蝶随机排列数组是一个Numbers数组,其排序方式是使数字随着我们接近数组中心而减少,而随着我们接近数组末尾而增加。最大的数字位于第一个索引处。
蝴蝶混排数组的另一个变体是数字朝着中心增加而朝着末端减少。在这种情况下,最小的数字放在最前面的索引处。
对于具有数学背景的人来说,它与高斯分布有一定的关系。
例
假设我们有这个数组-
const arr = [8,2,6,3,9,1,4,5,0,7];
如果我们对其应用蝴蝶改组,则输出将为-
[9, 7, 5, 3, 1,0, 2, 4, 6, 8]
了解最大和第二大数字如何放置在端点,最小数字如何放置在中间。
另一种可能是-
[0, 2, 4, 6, 8, 9, 7, 5, 3, 1]
我们的工作是编写一个将Numbers数组和一个字符串作为第二个参数的函数,该字符串可以采用两个值“ asc”或“ des”中的任何一个。-
如果string为'des',那么我们必须按升序或降序对数组进行洗牌。
如果是“ asc”,那么我们必须以降序升序对数组进行洗牌。
如果字符串是'asc',我们最初将数组按升序排序,否则按降序排序。因此,考虑使用'asc'调用了函数,则数组现在看起来像-
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
然后,我们将数组分成两个数组,以使相邻元素分布在相反的数组中。我们将元素推入一个数组中,而将元素移入另一个数组中,以便使一个数组反转而无需我们手动进行。
这样形成的两个数组看起来像-
[ 0, 2, 4, 6, 8 ] [ 9, 7, 5, 3, 1 ]
现在,最后一步是连接这些数组,然后将获得所需的数组。当放入代码时,所有这些看起来像这样-
const array = [8,2,6,3,9,1,4,5,0,7]; const butterflyShuffle = (array, order = 'asc') => { //创建一个数组的新副本,这样我们就不会变异原始的 array const arr = array.slice(); //升序或降序排序 arr.sort((a, b) => order === 'asc' ? a-b : b-a); const first = [], second = []; //此变量以后将帮助确定要使用哪个数组 reversed //以及将哪个连接到哪个 //如果长度是偶数,则表示最后一个元素将进入第二个数组 //否则它将进入第一个数组 const isEven = arr.length % 2 === 0; for (let i = 0; i < arr.length; i++){ if(i % 2 === 0){ isEven ? first.push(arr[i]) : first.unshift(arr[i]); continue; }; isEven ? second.unshift(arr[i]) : second.push(arr[i]); }; return isEven ? second.concat(first) : first.concat(second); }; console.log(butterflyShuffle(array)); console.log(butterflyShuffle(array, 'des'));
输出结果
控制台中的输出将为-
[ 9, 7, 5, 3, 1, 0, 2, 4, 6, 8 ] [ 0, 2, 4, 6, 8, 9, 7, 5, 3, 1 ]