WickmarkMedlem sedan juli 2003162 inlägg Hej hej,
jag håller på med en liten ASP/JScript applikation som, genom att läsa en textfil, skriver upp en highscore-lista i ett mindre datorspel. ASP/Jscript skriver man ju med JScript kod, och all array-funktioner jag någonsin sett fungera i javascript, fungerar på samma gång i ASP/Javascript också, så det är anledningen till att jag postar här.
Datorspelet skriver ut poängen i följande format:
[Poäng];[Namn]
dvs. t ex:
400;Arne Johansson
Det jag gör sedan är att jag delar upp poängen i en array genom att dela upp dem i radbrytningarna!
arrWrite = sContent.split("\n");
Hur gör jag så att arrayen sorteras efter antal poäng?
Denna kod innehåller fel som omnämns här!
arrWrite = sContent.split("\n");
arrWrite = arrWrite.sort();
var hiScoreTable = [];
for (i=0; i<arrWrite.length; i++){
hiScoreTable[i]=arrWrite[i].split();
}
// Skriv ut
document.write("<pre>");
for (i=hiScoreTable.length-1; i>-1; i--){
document.writeln("Poäng: " + hiScoreTable[i][0] + "\tNamn: " + hiScoreTable[i][0]);
}
document.write("</pre>");
nitro2k01: Om jag inte är helt fel ute så kommer din kod sätta 5;Pelle före 1000;Erik.
Jo, men titta noga så ser du att den andra for-loopen läser array'en baklänges när poängen ska skrivas ut.
Men man kan ju reversa arrayen också!
Denna kod innehåller fel som omnämns här!
arrWrite = sContent.split("\n");
arrWrite = arrWrite.sort().reverse();
var hiScoreTable = [];
for (i=0; i<arrWrite.length; i++){
hiScoreTable[i]=arrWrite[i].split();
}
// Skriv ut
document.write("<pre>");
for (i=0; i<hiScoreTable.length; i++){
document.writeln("Poäng: " + hiScoreTable[i][0] + "\tNamn: " + hiScoreTable[i][0]);
}
document.write("</pre>");
RGBMedlem sedan dec. 1999419 inlägg Ett exempel på hur du kan sortera en array
<PRE>
<SCRIPT>
var a=["700;kalle","4300;kurt","800;korven","100;klas","10000;konny"];
a.sort(function(a,b){return(parseInt(b)-parseInt(a))});
var i = -1;var c;
while(i<a.length){ c=a[++i].split(";"); document.write("Score: "+c[0]+"\t\tBy: "+c[1]+"<br>");}
</SCRIPT>
</PRE>
nitro2k01: Vad jag menade var att du gjorde en text-sortering vilket betyder att 5 är större än 1000.
RGB: Jo, att använda en egen sort-funktion är ju vettigt i det här fallet.
Javascripts parseInt är lite lustig som ignorerar bokstäver och annat som kommer efter siffrorna... :)
Som RGBs fast lite tydligare skrivet och ASP anpassat...
<%
function numericSort(a, b)
{
return parseInt(b) - parseInt(a);
}
var player = ["700;kalle", "4300;kurt", "800;korven", "100;klas", "10000;konny"];
player.sort(numericSort);
for (var i = 0; i < player.length; i++)
{
var playerData = player[i].split(";");
Response.Write("Score: " + playerData[0] + "\t\tBy: " + playerData[1] + "<br>");
}
%>
WickmarkMedlem sedan juli 2003162 inlägg Nehe, något gick fel!
Kod:
arrWrite.sort(numericSort);
Fel:
Number expected
Innehåll i arrayen:
200;Affe Johansson, 2003;Arne Ålesson, 54000;Mästaren
Kanske är så att parseInt blir sur för att det kommer bokstäver i strängen. Min kod funkade dock när jag körde den.
Bara för att testa, prova att ta bort numericSort och kom tillbaka.
WickmarkMedlem sedan juli 2003162 inlägg
Erik Juhlin skrev:
Kanske är så att parseInt blir sur för att det kommer bokstäver i strängen. Min kod funkade dock när jag körde den.
Bara för att testa, prova att ta bort numericSort och kom tillbaka.
Fungerade inge bra :(
Bifogar hela koden!
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="1252"%>
<!--#include virtual="/LWSWE/adojavas.inc"-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Poängräknare</title>
<style type="text/css" media="all">
body, th, td, p, table {
font-family: Arial, Verdana, Helvetica, sans-serif;
font-size: 12px;
font-color: #000000;
}
</style>
</head>
<body>
<%
function numericSort(a, b){
return b.parseInt - a.parseInt;
}
var sChart = new String(Server.MapPath("/LWSWE/_rubensoft_root/CAPPPoints/points.txt"));
var oFSO = new ActiveXObject("Scripting.FileSystemObject"),
oFile = oFSO.OpenTextFile(sChart, adModeRead),
sContent = new String(oFile.ReadAll()),
arrWrite = new Array(),
arrSub = new Array();
arrWrite = sContent.split("\n");
oFile.Close();
arrWrite.sort(numericSort);
for(var iX = 0; arrWrite.length > iX; iX++) {
if(arrWrite[iX].length > 1) {
arrSub = arrWrite[iX].split(";");
Response.Write("<span style=\"font-weight:900; color:red; " +
"font-size:14px;\">" +
arrSub[0] +
"</span><br />Spelare: " +
arrSub[1] +
"<hr noshade=\"noshade\" />");
}
}
%>
</body>
</html>
Vad fick du för fel när du tog bort numericSort?
Jag tror det fixar sig om du gör så här:
arrWrite = sContent.split("\r\n");
if (arrWrite.length==0)
arrWrite = sContent.split("\n");
Du kanske måste byta plats på \r och \n i första raden.
RGBMedlem sedan dec. 1999419 inlägg Du försöker hantera parseInt som en egenskap hos de värden du skickar till numericSort
function numericSort(a, b){
return b.parseInt - a.parseInt;
}
Prova med
function numericSort(a, b){
try
{
return parseInt(b) - parseInt(a);
}
catch(e)
{
Response.write(e.description);
}
}
[Edit]18 oktober 2004 19:44[/edit]
Oj, det missade jag helt. Sånt meckar man ju inte med! :p
RGB: Man måste skriva Response.Write eftersom att JavaScript är case-sensivite... :)
RGBMedlem sedan dec. 1999419 inlägg Response.write funkar det med :)
Okej, objektet är case-sensitive. Men metoderna är inte det. :)
WickmarkMedlem sedan juli 2003162 inlägg Okej, nu vet jag felet, men vet inte riktigt hur jag så smidigt som möjligt kan lösa det.Det som händer är helt enkelt att det läggs till en extra tom del i arrayen.... som sen skapar ett fel när man försöker sortera den.
Felbeskrivning:
http://rubensoft.se/LWSWE/_rubensoft_root/CAPPPoints/
WickmarkMedlem sedan juli 2003162 inlägg Har löst det nu!
Fick lägga till följande kod:
if(String(arrWrite[arrWrite.length]) == "undefined")
arrWrite.length = arrWrite.length - 1;
try
arrWrite.sort(numericSort);
catch(e)
Response.Write(e.description);
Tack så mycket för er hjälp!