按名称排序

2014年7月8日23:31:59

今天要下班的时候,本来兴致满满,不用加班,终于可以回家喝绿豆汤的那一刻,测试妹子提了一个捉急的需求。。

一级部门要按照固定部门的顺序排序,如果没有,就放在最后面。

一瞬间,我满满的回家热情就被浇灭了。闲话少扯,下面步入正题。

具体需求:按“合众媒体”,“合众互动”,“合众娱乐”,“服务中心”的顺序把一级部门排序,不在这四个里面的放在最后面。

最开始想到的是写在数组里,然后循环找到它的位置进行排序,但是循环。。还是尽量少用,哗哗的效率问题,最后灵机一动,突然机智了一下,想到下面的方法。

比如,我有“三”,“五”,“一”,按照“一","二","三","四","五”的顺序排序,代码如下:

1 var a=["一","二","三","四","五"];
2 var b=["三","五","一"];
3 
4 var c=a.join();
5 b.sort(function(n1,n2){
6     return c.indexOf(n1)-c.indexOf(n2);
7 });
8 
9 console.log(b); // 输出:["一", "三", "五"]

这么就出来了。但如果var b=["六","三","五","一"];,则b输出为["六", "一", "三", "五"],两种方法:

方法一:

 1 // 改变sort的判断方向,改变a的方向
 2 
 3 var a=["五","四","三","二","一"]; // a的方向
 4 var b=["六","三","五","一"];
 5 
 6 var c=a.join();
 7 b.sort(function(n1,n2){
 8     return c.indexOf(n2)-c.indexOf(n1); // sort的方向
 9 });
10 
11 console.log(b); // 输出["一", "三", "五", "六"]

方法二:

 1 // 根据sort原理:函数返回值小于0则换位,大于0则不换位
 2 // 如果排序数组里没它,就不让他换位置,堆到最后面去
 3 
 4 var a=["一","二","三","四","五"];
 5 var b=["六","三","五","一"];
 6 
 7 var c=a.join();
 8 b.sort(function(n1,n2){
 9     var i1=c.indexOf(n1),i2=c.indexOf(n2);
10     if(i1<0)return 1; // 没有它,不换位,后边呆着去
11     return i1-i2;
12 });
13 
14 console.log(b); // 输出["一", "三", "五", "六"]

最后,再完善一下,比如排序数组变成var a=["一","二五","三","四六","五"];这种情况,在一个值里面可能会检索到另一个值,这时需要加上分隔符,这里就简单用个逗号了。

 1 // 完整版(选用的第二种方法,明显B格比较高)
 2 
 3 var a=["一","二五","三","四六","五"]; // 按这个顺序排
 4 var b=["六","三","五","一"];         // 要排序的数组
 5 var split=",";                      // 分隔符
 6 
 7 var c=addSplit(a.join(split));      // ",一,二五,三,四六,五,"
 8 b.sort(function(n1,n2){
 9     var i1=c.indexOf(addSplit(n1)),
10         i2=c.indexOf(addSplit(n2));
11     if(i1<0)return 1;
12     return i1-i2;
13 });
14 
15 function addSplit(s){               // 都套上分隔符,跟正则里的边界是一样一样的
16     return split+s+split;
17 }
18 
19 console.log(b);                     // 输出["一", "三", "五", "六"],哦呵呵呵呵~

这篇文章算是本人第一篇技术方面的文章了,主要写写思路,感觉一个小时没白忙活。

虽然现在还没有,但下面那句话还是要加上,以后有了再补上链接和二维码:

如果您觉得这文章对您有帮助,可以打赏点钱给我,鼓励我继续写一些高质量的博文。

(二维码)+(链接)

PS:日子过得太悠闲,得抓紧了。。。

原文地址:https://www.cnblogs.com/ccforeverd/p/3861710.html