关于数组中字符串的排序有什么更好的解决办法么

Windersky 2015-09-22 03:50:05
一含有各种字符的数组(数字和大写字母为主),要求数字排在在字母之后,整体为升序排序,不知有什么更好的办法呢?或者以下代码可以做哪些优化?

var arry=["STEWARTS RT BEER 6/4/12 NR",
"7-UP 4/6/8 CN",
"1217-UP TEN 2/12 CN",
"DIET 7-UP 4/6/8 CN",
"1a1",
"FIJI 2/4/16.9 PET",
"FIJI 6/6/300 ML",
"FIJI 24/16.9 PET",
"7-UP TEN 2/12 CN",
"217-UP TEN 2/12 CN"];
var blnCheck = false;
var i = arry.length,j;
while(i>0){
for(j=0;j<i-1;j++){
len = Math.min(arry[j].length,arry[j+1].length);
for(k=0;k<len;k++){
//若arry[j][K]为数字,j+1不为数字 交换顺序
if((48<=arry[j][k].charCodeAt()&&arry[j][k].charCodeAt()<=57)&&(arry[j+1][k].charCodeAt()<47||arry[j+1][k].charCodeAt()>57)){
blnCheck = true;
break;
}
/*若arry[j][K]为数字,j+1为数字
*或arry[j][K]不为数字,i+1不为数字
* j>j+1 交换并跳出 j<j+1不交换
*/
if(((48<=arry[j][k].charCodeAt()&&arry[j][k].charCodeAt()<=57)&&(48<=arry[j+1][k].charCodeAt()&&arry[j+1][k].charCodeAt()<=57))||(arry[j][k].charCodeAt()<47||arry[j][k].charCodeAt()>57)&&(arry[j+1][k].charCodeAt()<47||arry[j+1][k].charCodeAt()>57)){
if(arry[j][k]>arry[j+1][k]){
blnCheck = true;
break;
}else if(arry[j][k]<arry[j+1][k]){
break;
}
}
//若arry[j][K]不为数字,j+1为数字 直接跳出,不需要交换
if((arry[j][k].charCodeAt()<47||arry[j][k].charCodeAt()>57)&&(47<arry[j+1][k].charCodeAt()&&arry[j+1][k].charCodeAt()<58)){
break;
}

}

if (blnCheck) {
tempExchangVal = arry[j];
arry[j] = arry[j + 1];
arry[j + 1] = tempExchangVal;
}
blnCheck = false;
}

i--;
}
//打印结果
arry.forEach(function(e){
document.write("</br>"+e+"</br>");
});
...全文
212 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Windersky 2015-09-23
  • 打赏
  • 举报
回复
引用 13 楼 weikeni19 的回复:
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Windersky 2015-09-22
  • 打赏
  • 举报
回复
引用 11 楼 u010087908 的回复:
那是我理解错了。 如果是这样的话,好像只能逐字符比较了。
O(∩_∩)O谢谢您的答案以及耐心解答,您这段
for ( var i = 0; i < arry.length; i++ ) {
            var e = arry[0];
            if ( !isNaN(e.charAt(0)) ) {
                arry.splice(0,1);
                arry = arry.concat([e]);
            }
        }
代码让我这个走在路上的小白,又一次开阔了眼界,过一两天若钓不到其他好玩的答案,就把分直接送您了。
NANU-NANA 2015-09-22
  • 打赏
  • 举报
回复
那是我理解错了。 如果是这样的话,好像只能逐字符比较了。
Windersky 2015-09-22
  • 打赏
  • 举报
回复
引用 9 楼 u010087908 的回复:
[quote=引用 8 楼 u011091122 的回复:] [quote=引用 5 楼 u010087908 的回复:]
		    		var arry=["STEWARTS RT BEER 6/4/12 NR",
		                      "7-UP 4/6/8 CN",
		                      "1217-UP TEN 2/12 CN",
		                       "DIET 7-UP 4/6/8 CN",
		                       "1a1",
		                      "FIJI 2/4/16.9 PET",
		                      "FIJI 6/6/300 ML",
		                      "FIJI 24/16.9 PET",
		                      "7-UP TEN 2/12 CN",
		                      "217-UP TEN 2/12 CN"];
		    	
		    	arry = arry.sort(function(a, b){
		    	    if(a< b) return -1;
		    	    if(a> b) return 1;
		    	    return 0;
		    	});		    	
		    	
		    	for ( var i = 0; i < arry.length; i++ ) {
		    		var e = arry[0];
		    		if ( !isNaN(e.charAt(0)) ) {
		    			arry.splice(0,1);
		    			arry = arry.concat([e]);
		    		}
		    	}
		    	console.log(arry);
是一种思路,但是仅保证了首字符的区分,若是后面每个字符都如此做一遍,开销会不会有点大额[/quote] 1。你为什么就是不肯执行一下看看结果呢? 2。你可以看一下javascript关于String的比较。 3。这段代码仅是在排序后,把数字开头的元素依序放到后面。不存在你说的“后面每个字符”轮番比较。 还是那句话,这里的数字也是字符。[/quote] 不好意思,我真的运行这段代码看结果了,我用这段代码运行出来的结果是:
引用
DIET 7-UP 4/6/8 CN FIJI 2/4/16.9 PET FIJI 24/16.9 PET FIJI 6/6/300 ML STEWARTS RT BEER 6/4/12 NR 1217-UP TEN 2/12 CN 1a1 217-UP TEN 2/12 CN 7-UP 4/6/8 CN 7-UP TEN 2/12 CN
但需求的结果,应该如下:
引用
DIET 7-UP 4/6/8 CN FIJI 2/4/16.9 PET FIJI 24/16.9 PET FIJI 6/6/300 ML STEWARTS RT BEER 6/4/12 NR 1a1 1217-UP TEN 2/12 CN 217-UP TEN 2/12 CN 7-UP TEN 2/12 CN 7-UP 4/6/8 CN
NANU-NANA 2015-09-22
  • 打赏
  • 举报
回复
引用 8 楼 u011091122 的回复:
[quote=引用 5 楼 u010087908 的回复:]
		    		var arry=["STEWARTS RT BEER 6/4/12 NR",
		                      "7-UP 4/6/8 CN",
		                      "1217-UP TEN 2/12 CN",
		                       "DIET 7-UP 4/6/8 CN",
		                       "1a1",
		                      "FIJI 2/4/16.9 PET",
		                      "FIJI 6/6/300 ML",
		                      "FIJI 24/16.9 PET",
		                      "7-UP TEN 2/12 CN",
		                      "217-UP TEN 2/12 CN"];
		    	
		    	arry = arry.sort(function(a, b){
		    	    if(a< b) return -1;
		    	    if(a> b) return 1;
		    	    return 0;
		    	});		    	
		    	
		    	for ( var i = 0; i < arry.length; i++ ) {
		    		var e = arry[0];
		    		if ( !isNaN(e.charAt(0)) ) {
		    			arry.splice(0,1);
		    			arry = arry.concat([e]);
		    		}
		    	}
		    	console.log(arry);
是一种思路,但是仅保证了首字符的区分,若是后面每个字符都如此做一遍,开销会不会有点大额[/quote] 1。你为什么就是不肯执行一下看看结果呢? 2。你可以看一下javascript关于String的比较。 3。这段代码仅是在排序后,把数字开头的元素依序放到后面。不存在你说的“后面每个字符”轮番比较。 还是那句话,这里的数字也是字符。
Windersky 2015-09-22
  • 打赏
  • 举报
回复
引用 5 楼 u010087908 的回复:
		    		var arry=["STEWARTS RT BEER 6/4/12 NR",
		                      "7-UP 4/6/8 CN",
		                      "1217-UP TEN 2/12 CN",
		                       "DIET 7-UP 4/6/8 CN",
		                       "1a1",
		                      "FIJI 2/4/16.9 PET",
		                      "FIJI 6/6/300 ML",
		                      "FIJI 24/16.9 PET",
		                      "7-UP TEN 2/12 CN",
		                      "217-UP TEN 2/12 CN"];
		    	
		    	arry = arry.sort(function(a, b){
		    	    if(a< b) return -1;
		    	    if(a> b) return 1;
		    	    return 0;
		    	});		    	
		    	
		    	for ( var i = 0; i < arry.length; i++ ) {
		    		var e = arry[0];
		    		if ( !isNaN(e.charAt(0)) ) {
		    			arry.splice(0,1);
		    			arry = arry.concat([e]);
		    		}
		    	}
		    	console.log(arry);
是一种思路,但是仅保证了首字符的区分,若是后面每个字符都如此做一遍,开销会不会有点大额
NANU-NANA 2015-09-22
  • 打赏
  • 举报
回复
赶紧结帖给分吧
NANU-NANA 2015-09-22
  • 打赏
  • 举报
回复
引用 4 楼 hch126163 的回复:
arry.sort(function(a, b){ return a<b? 1:0; }).reverse();
这个整体降序,楼主要数字和字母分别升序
NANU-NANA 2015-09-22
  • 打赏
  • 举报
回复
		    		var arry=["STEWARTS RT BEER 6/4/12 NR",
		                      "7-UP 4/6/8 CN",
		                      "1217-UP TEN 2/12 CN",
		                       "DIET 7-UP 4/6/8 CN",
		                       "1a1",
		                      "FIJI 2/4/16.9 PET",
		                      "FIJI 6/6/300 ML",
		                      "FIJI 24/16.9 PET",
		                      "7-UP TEN 2/12 CN",
		                      "217-UP TEN 2/12 CN"];
		    	
		    	arry = arry.sort(function(a, b){
		    	    if(a< b) return -1;
		    	    if(a> b) return 1;
		    	    return 0;
		    	});		    	
		    	
		    	for ( var i = 0; i < arry.length; i++ ) {
		    		var e = arry[0];
		    		if ( !isNaN(e.charAt(0)) ) {
		    			arry.splice(0,1);
		    			arry = arry.concat([e]);
		    		}
		    	}
		    	console.log(arry);
hch126163 2015-09-22
  • 打赏
  • 举报
回复
arry.sort(function(a, b){ return a<b? 1:0; }).reverse();
NANU-NANA 2015-09-22
  • 打赏
  • 举报
回复
引用 2 楼 u011091122 的回复:
[quote=引用 1 楼 u010087908 的回复:]
arry.sort(function(a, b){
    if(a< b) return -1;
    if(a> b) return 1;
    return 0;
})
好像没这么简单额,排完字母后才开始排数字的。 如数据:ABC123、ABD、A1D、123D、ABC、ACD、0123S 排序应为:ABC、ABC123、ABD、ACD、A1D、0123S、123D[/quote] 这里的数字也是字符,没有区别。 这段代码把所有的元素作升序排列。 你找到数字和字母的分界点,拆成两个数组,在重新结合一下就好了。 或者你要完整源码?
Windersky 2015-09-22
  • 打赏
  • 举报
回复
引用 1 楼 u010087908 的回复:
arry.sort(function(a, b){
    if(a< b) return -1;
    if(a> b) return 1;
    return 0;
})
好像没这么简单额,排完字母后才开始排数字的。 如数据:ABC123、ABD、A1D、123D、ABC、ACD、0123S 排序应为:ABC、ABC123、ABD、ACD、A1D、0123S、123D
NANU-NANA 2015-09-22
  • 打赏
  • 举报
回复
arry.sort(function(a, b){
    if(a< b) return -1;
    if(a> b) return 1;
    return 0;
})

87,838

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧