欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-23 12:16:24
这是今天在写vue项目时发生的一个小问题,在此记录一下,方便自己的回顾。项目是前后端分离的,前台主要使用了vue-cli3.0 + mintui,是一个移动端的web app包括了后台发布管理的一些功能,其他就先不介绍了,项目后期方便的话我会截取一些代码发布在我的github上,自己也是第一次尝试用 ......

  这是今天在写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其实很常见,只要一点点的去推导测试,最终解决问题,也能取得很大收获,这个过程是很爽的,痛并快乐着。。。