您当前的位置:首页 > 互联网教程

JS实现数组随机排序的三种方法详解

发布时间:2025-05-19 21:47:06    发布人:远客网络

JS实现数组随机排序的三种方法详解

一、JS实现数组随机排序的三种方法详解

实现数组随机排序的方法有很多,本文将详细介绍其中三种:

1.利用数组方法sort实现随机排序。

1.利用数组方法sort实现随机排序,使用for循环或Lodash等三方js方法库也能实现,但sort方法使用起来更加方便。sort方法的缺点是不够随机,因为它会利用一个比较器进行两两比较。示例代码:

2.洗牌算法实现随机排序,从原始数组中每次随机选中一个元素,然后放入新数组中,每取出一个元素后,将它从原数组中取出。示例代码:

random= Math.floor(Math.random()*array.length);

console.log(shuffle([1,2,3,4,5]));

3.洗牌算法深入分析,思路是从一副牌中随机抽取牌,旧的牌数量相应减少。示例代码:

function shuffle(m)//洗牌//抽牌法

//每次抽出一张牌,需要遍历整个数组,所以很耗时。

var rnd= Math.floor(Math.random()*i);

该方法耗时较长,因为删除数组中间的某个元素会导致后面的数据被执行。为了解决这个问题,可以将最后一张未抽的牌放在抽走的位置上。示例代码:

function shuffle_pick(m)//洗牌//抽牌法优化牌

//每次抽出一张牌,放在另一堆。把最后一张未抽的牌放在空位子上。

var rnd= Math.floor(Math.random()*i);

除了抽牌思路,还可以用换牌思路:随机交换两个位置,共交换n次,n越大,越接近随机。示例代码:

function shuffle_swap(m)//洗牌//换牌法

//第i张与任意一张牌换位子,换完一轮即可

var rnd= Math.floor(Math.random()*(i+1)),temp= arr[rnd];

除了抽牌与换牌的思路,还可以用插牌的思路:先有一张牌,第二张牌有两个位置可随机插入,第三张牌有三个位置可随机插入,依此类推。示例代码:

function shuffle_insert_1(m)//洗牌//插牌法

//每次生成一张最大的牌,插在随机的某张牌前。

//因为要在数组里插入元素,把后面的所有元素向后挤一位,所以很耗时。

arr.splice(Math.floor(Math.random()*(i+1)),0,i);

该方法会随着牌数的增多变得越来越困难,因为插牌会导致后面的很多牌都往后推一步。优化方法是先有n-1张牌,第n张牌放在最后,然后与任意一张牌互换位置。示例代码:

function shuffle_insert(m)//洗牌//插牌法优化版,可以用数学归纳法证明,这种洗牌是均匀的。

//每次生成一张最大的牌,与随机的某张牌换位子

var rnd= Math.floor(Math.random()*(i+1));

二、ExcelVBA中实现数组排序的多种方法

1、VBA里面没有现成的Sort方法可以使用,在ExcelVBA里面要对数组进行排序,现有的通常做法:

2、1,通过单元格赋值以后利用工作表里的Sort方法进行排序,

3、2,通过SQL实现,也需要调用单元格区域存放数据,

4、3,直接写循环语句通过算法来实现。

5、除了上述方法以外,借助一些其他语言工具与VBA相结合,也能利用现成的排序功能来实现数组排序,而不需要借助表格。

6、JavaScript里面也有Sort方法,可以拿来现成使用,示例代码如下:

7、Set js= CreateObject("msscriptcontrol.scriptcontrol")

8、arr= Application.Transpose(Range("A1:A10"))

9、js.addcode"function aa(bb){js=bb.split(‘,’);js.sort();return js;}"

10、sortarr= js.eval_r("aa(‘"& temp&"’)")

11、Set js= CreateObject("msscriptcontrol.scriptcontrol")

12、arr= Application.Transpose(Range("A1:A10"))

13、js.addcode"function aa(bb){js=bb.split(‘,’);js.sort();js.reverse();return js;}"

14、sortarr= js.eval_r("aa(‘"& temp&"’)")

15、Set js= CreateObject("msscriptcontrol.scriptcontrol")

16、arr= Application.Transpose(Range("A1:A10"))

17、js.addcode"function aa(bb){js=bb.split(‘,’);js.sort(function(a,b){return a-b;});return js;}"

18、sortarr= js.eval_r("aa(‘"& temp&"’)")

三、js怎么实现刮奖效果js怎么实现刮奖效果

varnum=6;//奖品数量varcanvas=document.getelementbyid(画布);定义变量

BTN=document.getelementbyid(btn如果(!canvas.getContext){

alert(不好意思!浏览器不支持。);返回;}//获取绘图上下文变量CTX=canvas.Getcontext(2d为

CTX.beginpath();//移动到圆心,然后围绕圆心旋转ctx.translate(150,150);//从(0,

0)坐标开始定义新的子路径ctx.moveTo(0,0);//旋转弧度,需要将角度转换成弧度,用度*Math.PI/180.

计算公式。ctx.rotate(360/num*i*Math。PI/180);//画圆弧ctx.arc(0,0,150,0,2

*数学。PI/num,false);if(I%2==0){CTX.fillstyle=#ffb820}否则{

ctx.fillStyle=}//填充扇区CTX.Fill();//绘制边框ctx.lineWidth=0.5

ctx.strokeStyle=CTX.stroke();//恢复之前的状态CTX.Restore();}

lo-dash与underscore.js的api基本一致。与underscore比其优势是,效率高;可自定义构建

Sugar在原生对象上增加一些工具方法

functional.js提够了一些Curry的支持

streamjs用流的方式来对数组,对象进行系列操作

Mock.js生成随机数据和mockAjax请求

ua-parser-js探测具体浏览器和版本,操作系统,设备类型等

console-polyfill能放心的使用console.log()之类的console方法

Konsole.js在页面的一个元素里输出log信息详细

BigDecimal.js提高精度的数字操作

JSDoc根据javascript文件中注释的信息,生成API文档详细

Selectivizr让IE6-8一些的css3选择器

ieBetter让ie6-8有高级浏览器的特性

ExplorerCanvas让IE8-的浏览器支持canvas

CSS3Pie让IE6-9支持border-radious,box-shadow,linear-gradient。可以使用.htc文件(注意Minetype)或.js文件。在用Pie.js时,box-radious的元素有背景色时,不显示背景色。。。

formFive让旧的浏览器支持HTML5表单的一些特性,如placeholder,autofocus

让浏览器支持object-fit这css规则

HTML5CrossBrowserPolyfills一堆Polyfills

flexibility让旧的IE也支持Flexbox

Lining.js让浏览器实现类似::nth-line(),::nth-last-line()的效果

prefixfree用了它,写css时,就不需要加浏览器的前缀了

jquery-file-upload上传文件组件详细

Treed树编辑器。感觉展示的感觉很像思维导图

FileAPI对文件选择框内的文件的一些处理

uniform提供对下拉框,单,复选框,按钮等表单元素的美化

DropKick下拉框,单,多选。外观比uniform好

nouislider用滚动条来设置/控制(音量等)

imagesLoaded选取的图片都加载好后执行调回

CSSgram用CSS3的Filter实现Instagram滤镜的库

HYBICON带交互效果。如hover,click

transformicons图标点击时,会有一些变换效果。如,加号变成叉号

css3patternscss3做的可平铺纹理。浏览器兼容性不好。

fancybox弹出查看图片,视屏等等demo

yoxview弹出查看图片,图片尺寸缩放很自然

WeUI由微信官方设计团队为微信Web开发量身设计。

dragula支持Draggable,Dropable和Sortable。感觉比jqueryUI的轻量级,好用的样子

angular-draguladragular官方的angular版本

highcharts功能强大。是收费的。

Plottable.JS基于D3的一个图表库

chartJs中文文档demo很漂亮,很清晰。比较轻量级。

ichartJs中国的一个家伙搞的,感觉还不错。

fullcalendar支持脱放的方式来改变待办事宜的时间

SimpleEventsCalendar外观很喜欢。收费5$

jQueryuidatepicker经典,不是很好看

pickadate轻量级,手机友好的,漂亮。但貌似只能在弹出层中显示,而没有下拉这种方式显示。

zebra-datepicker可配置性很强。但貌似只能在弹出在右上方。。。

bootstrap-datepickerbootstrap风格。

dateRangePicker选取时间段。bootstrap风格。该组件依赖TwitterBootstrap,Moment.js和jQuery.

perfectscrollbar轻量级的滚动条。外观与mac上chrome的滚动条一样。

backgrid基于Backbone.js的DataGrid

excellentexport把表格的内容生成excel。兼容Firefox,Chrome,IE6+

datatables表格可交互(对内容进行排序,删除等)

handsontable生成Excel外观的数据

ace代码编辑器,可以用来做demo演示

tinymce对html内容进行实时的编辑

html5media简单的h5player,轻量级

Impress.js各种旋转,和奇特的体验

fullPage全屏显示。用滚轮来翻页详细

zepto.fullpage专注于移动端的fullPage.js,依赖Zepto

turn.js做一本书,带漂亮的翻页的效果

slidesjs挺好用的,只是那幻灯导航的CSS都要自己写,呵呵详细

iSlider无任何插件依赖的手机平台javascript滑动组件详细

bgstretcher全屏幻灯,会随着页面大小的变化而变化。

Swiper开源、免费、强大的移动端触摸滑动插件Swiper中文网

coin-slider兼容IE6。蛮好的~。不过其切换方式是一块块的。不能配置切换方式。。。

wowslider幻灯切换时各种很炫的效果。收费。

cycle2普通的幻灯,竟然不支持垂直滚动。。。

jcarousel普通的幻灯,不兼容IE6

nodePPT国人做的,做ppt也相当不错。有些方面比reveal做的还好。但生成导出的html有些问题

roundabout3d切换,看的后面图片的边

Magnific-Popup兼容PC,Mobile。还不错,有5k+的star

layer国人开发的,兼容ie6+。不喜欢其调用方式。

mixitup用漂亮的动画效果来完成排序和筛选

卡片翻转效果2兼容性可以。写的比较简单:1,只支持x方向翻转2,类名都是规定好的3,只能被调用一次。需要改写一下。我的改进版见这里

TheaterJS模拟两个人在屏幕上对话

midnight.js文字颜色随着背景变,_炸了

color-animationjquery的颜色渐变动画插件。jquery的动画不支持颜色值的变化。改库提供了这个支持。

ClickSpark.js点击后的一些酷炫的效果

superscrollorama能做的效果更多,但要用第三方Tween的库,使用起来比较复杂。

swfobj能够自动检测PC、Mac机器上各种主流浏览器对Flash插件的支持情况。它使得插入Flash媒体资源尽量简捷、安全。而且它是非常符合搜索引擎优化的原则的。此外,它能够避免您的HTML、XHTML中出现object、embed等非标准标签,从而符合更加标准。详细

jqueryrotate旋转插件。可以用来做转盘抽奖效果

Intro.js用来介绍网站的功能很不错。也可以做新手引导。

simple-hint提示信息。用css做的。兼容性IE9+。

dotdotdot文字溢出时,添加在文字末尾加省略号

jQuery-menu-aim二级菜单的切换如Amazon主页上一样迅速

DlHighlight仅支持JavaScript、CSS、XML、HTML这4语法高亮

Awesomplete输入的智能提示,自动补全

proTip提示。感觉比Bootstrap的tip好

Hammerjs手势库。封装了Swipe,Tap,Pinch,Pan等手势

velocity提高Jquery动画的性能。以及颜色动画之类的新特性。

Snap.svg操作SVG的JS库。号称SVG的jQuery。demo

walkway以动画的方式,渐渐地画出SVG的路径。

ZeroClipboard将内容复制到剪切板兼容主流浏览器的解决方案详细

html2canvashtml转化成canvas,可以用来做截图。详细

抓取,解析RSS内容(不能跨域,所以后台要做代理,所谓的解析Rss其实就是解析xml)

cylon.js机器人框架,支持35个平台

devices.css移动设备边框的外观。做原型的时候用不错。

Bootbox.js对bootstrap的弹出框做的一些封装

jQueryCards高质量的jQuery插件网站

npmrankSortnpmpackagesbypagerank

YOUMIGHTNOTNEEDJQUERYPLUGINS不依赖jQuery的js插件。

OniUI去哪儿网做的一套基于Avalon的框架

语法与jquery几乎一样,会jquery基本会zepto~

解决页面不支持弹性滚动,不支持fixed引起的问题~

实现下拉刷新,滑屏,缩放等功能~

笔者没用过,不过听说好用,推荐给大家~

该库提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象。

适合上下滑屏、左右滑屏等滑屏切换页面的效果

flex布局目前可使用在移动中,并非所有的语法都全兼容,效果良好~