谈谈排序表格

2005-06-30 09:34 | aptx

名称装备范围攻击力价格场所
パチンコ〇 〇 〇 X1体530マド
ボウガン〇 〇 〇 X1体1280マド
ショットガン〇 〇 〇 X1组22180マド
リベットガン〇 〇 〇 X1体29280エルニニョ
Wチェーンソー〇 X 〇 X1体38430エルニニョ
しばやき砲〇 〇 〇 X1体48600ハトバ
44マグナム〇 〇 〇 X1体61850サースティ,タイシャー
ブーメランスパナX 〇 X X1体551300ハトバ
ミニバルカン〇 〇 〇 X1组752000デルタ.リオ,タイシャー
ひぼたんのドス〇 X 〇 X1体801750バザースカ
電撃ムチX X 〇 X1体892500非卖品
バーナーガン〇 〇 〇 X1体1022900デルタ.リオ
ちょうおんぱ銃〇 〇 〇 X1体1103400イスラポルト
さんでっぽう〇 〇 〇 X1体1153800イスラポルト
ブラストハンマーX X 〇 X1体1305000モロ.ポコ东面的野外商店
ランボーの弓矢〇 X 〇 X1体1254400非卖品
SMGグレネード〇 〇 〇 X1组1184990タイシャー
フリーズガン〇 〇 〇 X1体1336000タイシャー
レーザーライフル〇 X 〇 X1体1487700モロ.ポコ,デスクルス
オニぼうちょう〇 X 〇 X1体1608800デスクルス
ニトロシャワーX X 〇 X全体17516000非卖品
ガルシアガン〇 X 〇 X1体19012000非卖品
リモコンスパナX 〇 X X1体1459000デスクルス
ロケットパンチ〇 X 〇 X1体21017550人間ビレッジ,デスクルス
ビームブリザード〇 〇 〇 X1组1952000メルトタウン
ブロイラーボンベX X 〇 X1组240-非卖品
ハウリング砲〇 〇 〇 X1体23525000人間ビレッジ
TNTパラノイヤX X 〇 X全体22028800非卖品
シザーハンドX 〇 〇 X1体21118000非卖品
ラッシャーマイク〇 〇 〇 X1体1588000非卖品
水中銃〇 〇 〇 X1体951200非卖品
オメガブラスター〇 〇 〇 X1体25029800非卖品
レーザーバズーカ〇 〇 〇 X全体22530000非卖品
ポチガンX X X 〇1体35250エルニニョ
ポチバーナーX X X 〇1体55480サースティ,イスラポルト
ポチバルカンX X X 〇1组751100バザースカ,イスラポルト
ポチバズーカX X X 〇1体901550デルタ.リオ,イスラポルト
ポチレーザーX X X 〇1体1202400スワン
ポチソニックX X X 〇1体1553900タイシャー
ポチランチャーX X X 〇1组1605500モロ.ポコ
ポチブリザードX X X 〇1体2007000非卖品
ポチキャノンX X X 〇1体23515000メルトタウン
ポチサンダーX X X 〇1组19010500デスクルス
ポチウィングX X X 〇1组20516000人間ビレッジ

记得有人曾经说过:“技术教程的最大受益者是谁?是编写者自己”。这句话给我的感触很深。做专题也好,写攻略也罢,或许自己所做的没有任何物质或精神上的回报,但是却在无形中提高着自己。

注意,此文主要谈谈思路和个别细节(不同的语言是不相通的,程序语言尤是如此。太多的东西都必须亲自深入研究才能领会),可能比较杂,不过有时间我会重新整理的。排序表格大体应该分为三个步骤:读取、排序、输出。所以我首先定义了一个SortTable类,然后又定义了3个静态方法,分别是SortTable.read()、SortTable.sort()、SortTable.output(),三个方法分别对应上述的三个步骤。

读取——SortTable.read():所谓的表格排序其实是给表格某列单元格排序,然后再根据排好序后的原表格单元格所在的行数重新输出表格的HTML(这个地方不太好用语言描述,需要自己揣摩领悟)。在排序之前必须先把该列的单元格数据逐个读出来。这就会产生两个问题:

  1. 表格内的数据很可能会分为两种,字符串型和数字型。并且两种数据很可能会混在一起。所以必须把它们分开并用两个数组分别存放
  2. 我们需要的数据是单元格内的innerText,而不是innerHTML,FireFox是没有innerText的……
第一个没什么难的,代码如下

这里有一句比较特殊,那就是 StrTemp = StrTemp + "#" + i; ,这句的意思是取单元格的第一个字符然后加上这个单元格的行数,并用#作为分隔符。详细原因下面会提到。

第二个便是FireFox比较欠扁的地方了,对这种情况通常是创建一个Range对象,然后获取它的值

幸运的是,这是整个程序里唯一一个需要考虑兼容性的地方。

排序——SortTable.sort():这里也有两点需要注意:

  1. Array的sort方法有个局限性,就是它是把数组的元素作为字符来看待的。例如对于这种(3,5,2,4,8,23,18,13)数字数组,用sort排序之后结果会是(13,18,2,23,3,4,5,8),而不是(2,3,4,5,8,13,18,23)。也就说,数字必须单独排序,(这就是为什么在读取单元格数据时要把字符串和数字分开装)。这里我用的冒泡法。

  2. ArrStr[i] = ArrStr[i].match(re).toString().slice(1);这句可能不太好理解。对于这种句子,最好使用alert一步步的测试。如果随便alert一个ArrStr的元素,你会发现它们的结构都是这样的:字符串#数字。其中的字符串显然就是单元格中的数据,#后的数字则是这个单元格所在的行数。剩下的match(re).toString().slice(1)则是从这个字符串中提取#后的数字。这样一来就得到了排好序后的单元格所在的行数

输出——SortTable.output():这个方法其实就是根据排好序后的单元格所在的行数输出表格HTML。值得一提的是直接往table里innerHTML是行不通的,所以这里使用一个span标签把table给包了起来,然后再往这个span里填充新表格的HTML

最后补充一下,此文不是教程,如果想根据此文就能读懂源码是很困难的(至少换我一定会是这样)。读懂源码方法只有一个,就是先抛开一切,用自己的思维去做一个排序表格。当对排序表格的原理有一定认识的时候再来看我的,就一定会有事半功倍的效果,也说不定此时我写的在你看来都成了废话了 ^^