PDA

View Full Version : Arranging values problem


ashleypower
03-19-2003, 02:49 PM
Here's my code:

<HTML>

<HEAD>

<SCRIPT LANGUAGE = "JavaScript">
<!--
var aFields = new Array('A', 'B', 'C', 'D', 'E', 'F');

function GetTopThree(oForm) {

var aValues = new Array();

for (var a = 0; a < aFields.length; a++)
aValues[a] = eval('parseInt(oForm.textbox' + aFields[a] + '.value)');

for (var i = 0; i < (aValues.length - 1); i++) {

for (var j = i + 1; j < aValues.length; j++) {

if (aValues[j] > aValues[i]) {

var iTempValue = aValues[i];
aValues[i] = aValues[j];
aValues[j] = iTempValue;

var sTempValue = aFields[i];
aFields[i] = aFields[j];
aFields[j] = sTempValue;
}
}
}

for (var k = 0; k < 2; k++) {

if ((aValues[k] == aValues[k + 1]) && (aFields[k] > aFields[k + 1])) {

var iTempValue2 = aValues[k];
aValues[k] = aValues[k + 1];
aValues[k + 1] = iTempValue2;

var sTempValue2 = aFields[k];
aFields[k] = aFields[k + 1];
aFields[k + 1] = sTempValue2;
}
}

oForm.topThree.value = aFields[0] + aFields[1] + aFields[2];
}
//-->
</SCRIPT>

</HEAD>

<BODY>

<FORM NAME = "myForm" onsubmit = "GetTopThree(this); return false;">

<INPUT TYPE = "text" SIZE = "3" NAME = "textboxA">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxB">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxC">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxD">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxE">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxF">
<BR>
<INPUT TYPE = "submit" NAME = "submit" VALUE = "Get Code">
<P>
<INPUT TYPE = "text" NAME = "topThree">

</FORM>

</BODY>

</HTML>

Numbers are inserted into the fields, labeled from "a" to "f". The numbers are sorted in numerical order. If two numbers are the same, it goes in alphabetical order, and takes the top 3 values. Here's what I mean:

A = 1, B = 1, C = 1, D = 1, E = 1, F = 2 should output FAB

BUT.... my code outputs FBC.

Help please!

Danne
03-19-2003, 05:42 PM
You swapped the A and F with each other, so the could be found at the end of the array. What you want to do is to move the F to the first place.

Try it using the splice function:



function GetTopThree(oForm)
{
var aValues = new Array();
for (var a = 0; a < aFields.length; a++)
aValues[a] = eval('parseInt(oForm.textbox' + aFields[a] + '.value)');

for (var i = 0; i < (aValues.length - 1); i++)
for (var j = i+1; j < aValues.length; j++)
if (aValues[j] > aValues[i])
{
aValues.splice(i,0,aValues.splice(j,1)); // Remove item at j and insert it at i
aFields.splice(i,0,aFields.splice(j,1));
}
oForm.topThree.value = aFields[0] + aFields[1] + aFields[2];
}

ashleypower
03-19-2003, 05:50 PM
I replaced my code with yours, and when I submit, nothing happens....this is what the address bar looks like:

file:///C:/WINDOWS/Desktop/results.htm?textboxA=1&textboxB=1&textboxC=1&textboxD=1&textboxE=1&textboxF=2&submit=Get+Code&topThree=

Nothing is entered into the results field.

What am I doing wrong?

Danne
03-19-2003, 06:00 PM
Don't know..:)

Here's the full code, that I used:



<HTML>

<HEAD>

<SCRIPT LANGUAGE = "JavaScript">
<!--
var aFields = new Array('A', 'B', 'C', 'D', 'E', 'F');

function GetTopThree(oForm)
{
var aValues = new Array();
for (var a = 0; a < aFields.length; a++)
aValues[a] = eval('parseInt(oForm.textbox' + aFields[a] + '.value)');

for (var i = 0; i < (aValues.length - 1); i++)
for (var j = i+1; j < aValues.length; j++)
if (aValues[j] > aValues[i])
{
aValues.splice(i,0,aValues.splice(j,1)); // Remove item at j and insert it at i
aFields.splice(i,0,aFields.splice(j,1));
}
oForm.topThree.value = aFields[0] + aFields[1] + aFields[2];
}
//-->
</SCRIPT>

</HEAD>

<BODY>

<FORM NAME = "myForm" onsubmit = "GetTopThree(this); return false;">

<INPUT TYPE = "text" SIZE = "3" NAME = "textboxA" value="1">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxB" value="1">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxC" value="1">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxD" value="1">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxE" value="1">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxF" value="2">
<BR>
<INPUT TYPE = "submit" NAME = "submit" VALUE = "Get Code">
<P>
<INPUT TYPE = "text" NAME = "topThree">

</FORM>

</BODY>

</HTML>


Works fine for me in IE 5.5. The splice is core javascript since JavaScript1.3. In JavaScript1.2 it didn't return the removed item, which is mecessary for it to work...

glenngv
03-20-2003, 01:57 AM
why not just use the sort method of Array?


<HTML>

<HEAD>

<SCRIPT LANGUAGE = "JavaScript">
<!--
var aFields = new Array('A', 'B', 'C', 'D', 'E', 'F');

function GetTopThree(oForm) {

var aValues = new Array();

for (var a = 0; a < aFields.length; a++) {
aValues[a] = new Array(); //make a 2D array
aValues[a][0] = parseInt(oForm.elements['textbox' + aFields[a]].value,10);
aValues[a][1] = aFields[a];
}

aValues.sort(sortNumDesc); //sort in descending order

oForm.topThree.value = aValues[0][1] + aValues[1][1] + aValues[2][1];
}

//sort compare function
function sortNumDesc(a,b) {
//[0] means the first item in the associative (2D) array will be sorted
if (a[0] > b[0]) return -1;
if (a[0] < b[0]) return 1;
return 0;
}

//-->
</SCRIPT>

</HEAD>

<BODY>

<FORM NAME = "myForm" onsubmit = "GetTopThree(this); return false;">

<INPUT TYPE = "text" SIZE = "3" NAME = "textboxA" value="1">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxB" value="1">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxC" value="1">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxD" value="1">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxE" value="1">
<INPUT TYPE = "text" SIZE = "3" NAME = "textboxF" value="2">
<BR>
<INPUT TYPE = "submit" NAME = "submit" VALUE = "Get Code">
<P>
<INPUT TYPE = "text" NAME = "topThree">

</FORM>

</BODY>

</HTML>



and eval() is not necessary...:D

beetle
03-20-2003, 04:22 AM
I made an assocSort method (http://www.codingforums.com/showthread.php?s=&threadid=16069&highlight=sort) that will handle this. You can sort by key or value, ascending or descending.

glenngv
03-20-2003, 05:29 AM
same approach...:) only I created the associative array dynamically since the numbers in it are user input.