xuzuning(唠叨)請進:數組排序,在IE正常,Netscape就不聽使喚啦!!!

beret 2003-08-18 05:23:41
還是上次的數組

数组如下:

content1 = new Array();
content1[0] = new Array("01","aaaaa","46","1","0");
content1[1] = new Array("02","bbbbb","8","1","1");
content1[2] = new Array("03","ccccc","10","1","0");
content1[3] = new Array("04","ddddd","11","2","0");
content1[4] = new Array("05","eeeee","15","2","0");
content1[5] = new Array("06","fffff","17","1","0");
content1[6] = new Array("07","ggggg","20","3","0");
content1[7] = new Array("08","hhhhh","32","3","0");
content1[8] = new Array("09","iiiii","41","2","0");
content1[9] = new Array("10","jjjjj","2","1","0");


现在需要的排序方法是先按content1[i][4]的值从小到大,再按content1[i][3]的值从小到大,再根据content1[i][2]的值从大到小的顺序排序,小弟因为对JavaScript语言不是很熟,上次 xuzuning(唠叨)朋友也幫我寫了兩個按content1[i][3]的值从小到大,再根据content1[i][2]的值从大到小的顺序排序的方法,現在要加多一項,先以content1[i][4]的值从小到大來排,再按content1[i][3]的值从小到大,content1[i][2]的值从大到小的顺序排序。請問怎樣加上去,谢谢!

------------------------------------
xuzuning(唠叨)朋友上次給的答案如下:

var sort_key = 0; // 列号
function sort_asc(a,b) { // 升序
return (a[sort_key]-b[sort_key]);
}
function sort_desc(a,b) { // 降序
return (b[sort_key]-a[sort_key]);
}

sort_key = 2;
ar = content1.sort(sort_desc);
sort_key = 3;
ar = ar.sort(sort_asc);
sort_key = 4;
ar = ar.sort(sort_asc);
for(v in ar)
document.write(ar[v]+"<br/>");

現在客戶最低要求要支持Netscape6.2,但程序在Netscape6.2下不管用了,它只按數組的順序排列,請問有解決兼容的辦法嗎?謝謝!
...全文
22 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
beret 2003-08-21
  • 打赏
  • 举报
回复
謝謝glassprogrammer(),我的問題已經解決啦,原來是我的算法寫得有問題,出錯的不是NetScape,是IE。

------------------
sort_key = 2;
ar = content1.sort(sort_desc);
sort_key = 3;
ar = ar.sort(sort_asc);
sort_key = 4;
ar = ar.sort(sort_asc);
for(v in ar)
document.write(ar[v]+"<br/>");

--------------------------------------------------------------
上面的排序方法,其實根本就沒有按我的要求來做,還是我自己犯了一個低級錯誤,現把正確的方法貼給大家參考參考。(在IE6、NetScape6.21、NetScape7.0、NetScape7.1通過)


<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<link rel="stylesheet" href="style.css" type="text/css">
<script language="JavaScript">
<!--
content1 = new Array();
content1[0] = new Array("aaa","01","46","1","0");
content1[1] = new Array("bbb","02","18","1","1");
content1[2] = new Array("ccc","03","10","1","0");
content1[3] = new Array("ddd","04","10","1","0");
content1[4] = new Array("eee","05","15","2","0");
content1[5] = new Array("fff","06","17","1","0");
content1[6] = new Array("ggg","07","20","3","1");
content1[7] = new Array("hhh","08","32","3","0");
content1[8] = new Array("iii","09","41","2","0");
content1[9] = new Array("jjj","10","03","1","0");

//組合排序
function solesort(a,b)
{
var num = a.length;
if (a[num-1]-b[num-1]!=0) //降序
return -(a[num-1]-b[num-1]);
if (a[num-2]-b[num-2]!=0) //升序
return a[num-2]-b[num-2];
if (a[num-3]-b[num-3]!=0) //降序
return -(a[num-3]-b[num-3]);
return a[num-4]-b[num-4]; //升序
}

//打印結果
//先按下標4降序排列,再按下標3升序排列,再按下標2降序列,下標1判斷在前三種相同的情況下按原數據位置排列
ar = content1.sort(solesort);
for(v in ar)
document.write(ar[v]+"<br/>");
//-->
</script>
</HEAD>
<BODY bgcolor="#FFFFFF" text="#000000">
</BODY>
</HTML>

-------------------------------------------------------------------------------

因為在實際中,排序的數組是按要求動態生成的,所以這個判斷需要將條件放到數組的后四位中才能起作用。
Debian 2003-08-20
  • 打赏
  • 举报
回复
>>To: lions911(--ASP--ASP.NET--) ,難道你覺得做一個東西出來只有一個東西才支持,這樣的產品你覺得好嗎???

说的很好。
glassprogrammer 2003-08-20
  • 打赏
  • 举报
回复
这是另外的那个例子, 排序结果在 IE 和 Mozilla 下测试通过, 是一样的
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<script language="JavaScript">
<!--
content1 = new Array();
content1[0] = new Array("01","aaaaa","46","1","0");
content1[1] = new Array("02","bbbbb","8","1","1");
content1[2] = new Array("03","ccccc","10","1","0");
content1[3] = new Array("04","ddddd","11","2","0");
content1[4] = new Array("05","eeeee","15","2","0");
content1[5] = new Array("06","fffff","10","1","0");
content1[6] = new Array("07","ggggg","20","3","0");
content1[7] = new Array("08","hhhhh","32","3","0");
content1[8] = new Array("09","iiiii","41","2","0");
content1[9] = new Array("10","jjjjj","10","1","0");

var sort_string = ""; //需要排序的列的集合, 以逗号分开, 如果列号前面有负号, 代表DESC排序
//例如 3,2,-1 代表按照 第3,2,1列排序, 其中第1列为DESC排序
//注意列号是从0开始的

function doSort(rowA, rowB){
var keys = sort_string.split(",");
var nA = ""; //nA 和 nB 保存代表该行在排序中的一个数字, 每位对应 sort_string 中的一列
var nB = ""; //例如 三个排序自动, sA = 100, sB=000, 那么说明两行比较时第一列 rowA 较大.
for (var i=0; i<keys.length; i++){
//获得 sort_string 中的列号, 以及是否DESC排序
var idx = keys[i];
var ascending = 1;
if (idx < 0){
idx = -1 * idx;
ascending = -1;
}
//比较两行数据中该列的值
var cellA = rowA[idx];
var cellB = rowB[idx];
if (cellA > cellB){
polarity = 1;
}else if (cellA == cellB){
polarity = 0;
}else{
polarity = -1;
}
polarity = ascending*polarity;
//确定 nA/nB
if(polarity>0){
nA = nA + "1";
nB = nB + "0";
}else if(polarity==0){
nA = nA + "0";
nB = nB + "0";
}else{
nA = nA + "0";
nB = nB + "1";
}
}
//alert("RowA("+rowA+"):["+nA+"], RowB("+rowB+"):["+nB+"]");

//sort() 方法调用的函数要求 A>B, 返回 正数, A==B, 返回 0, A<B, 返回 负数
if (nA > nB){
return 1;
}else if (nA == nB){
return 0;
}else{
return -1;
}
}

function sort(){
sort_string = "3,2,-1";
var ar = content1.sort(doSort);

document.write("<Table width='50%' border=1>");
for(v in ar) {
document.write("<tr>");
for(var i=0; i<5; i++){
document.write("<td>"+ar[v][i]+"</td>");
}
document.write("<tr>");
}
document.write("<Table>");
}
//-->
</script>
<body onload="sort();">

</body>
</html>
glassprogrammer 2003-08-20
  • 打赏
  • 举报
回复
原先的我给改了一下, 可以在 IE 和 NS6+/Mozilla 下跑了, 不过在二者中结果有些不太一样(别急, 下一贴我给另外一个例子), 另外原来程序为什么不能在 NS 下跑的原因是 ar = content1.sort(sort_desc);, 应该改为 var ar = content1.sort(sort_desc); :P

<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<script language="JavaScript">
<!--
content1 = new Array();
content1[0] = new Array("01","aaaaa","46","1","0");
content1[1] = new Array("02","bbbbb","8","1","1");
content1[2] = new Array("03","ccccc","10","1","0");
content1[3] = new Array("04","ddddd","11","2","0");
content1[4] = new Array("05","eeeee","15","2","0");
content1[5] = new Array("06","fffff","10","1","0");
content1[6] = new Array("07","ggggg","20","3","0");
content1[7] = new Array("08","hhhhh","32","3","0");
content1[8] = new Array("09","iiiii","41","2","0");
content1[9] = new Array("10","jjjjj","10","1","0");

var sort_key = 0; // 列号
var ascending = true; //升序/降序

function doSort(rowA, rowB){
var cellA = rowA[sort_key];
var cellB = rowB[sort_key];
//sort() 方法调用的函数要求 A>B, 返回 正数, A==B, 返回 0, A<B, 返回 负数
var polarity = 0 ;
if (cellA > cellB){
polarity = 1;
}else if (cellA == cellB){
polarity = 0;
}else{
polarity = -1;
}
//根据升序/降序调整
polarity = ascending ? polarity : -1*polarity;

return polarity;
}

function sort(){
var ar = content1;

sort_key = 2 - 1; //js 中数组是从 0 开始的
ascending = false; //降序
ar = ar.sort(doSort);

sort_key = 3 - 1;
ascending = true; //升序
ar = ar.sort(doSort);

sort_key = 4 - 1;
ascending = true; //升序
ar = ar.sort(doSort);

//document.write(ar[v]+"<br/>");

document.write("<Table width='50%' border=1>");
for(v in ar) {
document.write("<tr>");
for(var i=0; i<5; i++){
document.write("<td>"+ar[v][i]+"</td>");
}
document.write("<tr>");
}
document.write("<Table>");
}
//-->
</script>
<body onload="sort();">

</body>
</html>
lions911 2003-08-19
  • 打赏
  • 举报
回复
什么时代了还用NETSCAPE
孟子E章 2003-08-19
  • 打赏
  • 举报
回复
http://www.google.com/search?hl=zh-CN&ie=UTF-8&oe=UTF-8&q=sort+array+javascript&lr=
beret 2003-08-19
  • 打赏
  • 举报
回复
暈。難道沒有玩Netscape了嗎????拜托幫幫忙啊。小弟急死啦!!!!
beret 2003-08-19
  • 打赏
  • 举报
回复
怎么都不來了。。
beret 2003-08-19
  • 打赏
  • 举报
回复
我想到一個辦法,就是分三次去讀數組,然后將生成的列表組合新的數組,那么最終數組一定是想要的結果。我的構思如下:
第一次讀...
sort_key = 2;
ar = content1.sort(sort_desc);
for(v in ar)

在這建立數組1
//document.write(ar[v]+"<br/>");

第二次讀

sort_key = 3;
ar = 數組1.sort(sort_asc);
for(v in ar)

在這建立數組2
//document.write(ar[v]+"<br/>");

第三次讀....

sort_key = 4;
ar = 數組2.sort(sort_asc);
for(v in ar)
document.write(ar[v]+"<br/>");

這樣的話應該可以得到想要的列表吧?但我不會建立那兩數組,希望大家幫幫忙吧,先謝了!
beret 2003-08-19
  • 打赏
  • 举报
回复
To: lions911(--ASP--ASP.NET--) ,難道你覺得做一個東西出來只有一個東西才支持,這樣的產品你覺得好嗎???加上這也是客戶要求的。

87,902

社区成员

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

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