记录--js中出现的数组排序问题

2022-10-15,,,

  这是今天在写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方法。

 js中sort()方法原理及使用

sort()  方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串unicode码。因为排序是按照字符串unicode码的顺序进行排序的,所以首先应该把数组元素都转化成字符串(如有必要)

,以便进行比较。 语法:arrayobject.sort(sortby); 参数sortby 可选,用来规定排序的顺序,但必须是函数。

 看到这里我突然想到会不会是因为我传入的数组也是字符串,检查了一下代码,发现确实有这种可能,因为我的数组中的元素是从其他字符串数组中循环截取的,那么数字字符串排序比较就会出现这种错乱的问题,因为比较的是ascii码,然后我加上了parseint,再次测试,没有问题。

总结:发生问题与bug其实很常见,只要一点点的去推导测试,最终解决问题,也能取得很大收获,这个过程是很爽的,痛并快乐着。。。

《记录--js中出现的数组排序问题.doc》

下载本文的Word格式文档,以方便收藏与打印。