记录--js中出现的数组排序问题
这是今天在写vue项目时发生的一个小问题,在此记录一下,方便自己的回顾。项目是前后端分离的,前台主要使用了vue-cli3.0 + mintui,是一个移动端的web app包括了后台发布管理的一些功能,其他就先不介绍了,项目后期方便的话我会截取一些代码发布在我的github上,自己也是第一次尝试用mintui框架,当时也是感觉非常的好看,组件化开发的话也是非常方便。这次开发中主要遇到的一个问题是在一个数组排序中,发现排序后的顺序不对,排序方法是经过测试没有问题的,只是这次数据量增加了一些就发生了顺序错乱的问题,刚开始以为是数据的问题,或是其他地方影响了,因为这个排序方法原来一直是可以正常使用的,后来我检查了排序的入参数组,发现没有问题,只好在排序方法的中写几个console看一下结果,发现就是排序出了问题...
这里先贴一下排序方法:
1 // 快速排序 每次选择最左边的数作为基数 2 function quicksort(arr){ 3 if (arr.length<2) { return arr; } 4 // 定义左指针 5 var left=0; 6 // 定义右指针 7 var right=arr.length-1; 8 //开启每一轮的排序 9 while(left<right){ 10 // 寻找右边比arr[0]小的数的下标 11 while(arr[right]>=arr[0] && left<right){ 12 right=right-1; 13 } 14 // 寻找左边比arr[0]大的数的下标 15 while(arr[left]<=arr[0] && left<right){ 16 left++; 17 } 18 //当左边指针与右边指针相遇后,交换arr[0]与当前两个指针所在的元素 19 if (right==left) { 20 let mid=arr[right]; 21 arr[right]=arr[0]; 22 arr[0]=mid; 23 break; 24 } 25 // 当左指针小于右指针的位置,交换两个指针当前位置的元素 26 let tem=arr[right]; 27 arr[right]=arr[left]; 28 arr[left]=tem; 29 } 30 //递归实现 31 return quicksort(arr.slice(0,left)).concat(arr.slice(left,right+1)).concat(quicksort(arr.slice(right+1))); 32 }
去浏览器的控制台测试了好几遍都没有什么问题,包括后来换了冒泡排序都是错乱的结果,这让我有点摸不着头脑,干脆去搜了一下js的数组排序,无意中搜到了sort方法。
sort() 方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串unicode码。因为排序是按照字符串unicode码的顺序进行排序的,所以首先应该把数组元素都转化成字符串(如有必要)
,以便进行比较。 语法:arrayobject.sort(sortby); 参数sortby 可选,用来规定排序的顺序,但必须是函数。
看到这里我突然想到会不会是因为我传入的数组也是字符串,检查了一下代码,发现确实有这种可能,因为我的数组中的元素是从其他字符串数组中循环截取的,那么数字字符串排序比较就会出现这种错乱的问题,因为比较的是ascii码,然后我加上了parseint,再次测试,没有问题。
总结:发生问题与bug其实很常见,只要一点点的去推导测试,最终解决问题,也能取得很大收获,这个过程是很爽的,痛并快乐着。。。
上一篇: 今天讲讲质量上乘美味可口的世界一号苹果
下一篇: 好水川之战:北宋全军覆没,大将没一个存活