Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.246.203] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Есть таблица данных:
Вот как я эти данные отображаю на экране: function showPlayers(pl) { for ( i=0 ; i<4 ; i++ ) { var strName = 'Pl'+i; var objTD = document.getElementById(strName); objTD.innerText = pl[order[i]]; } } var pl = new Array(4); pl[0] = "Vasya"; pl[1] = "Petya"; pl[2] = "Kolya"; pl[3] = "Tanya"; var age=new Array(4); age[0]= 19; age[1]= 23; age[2]= 45; age[3]= 33; <TABLE BORDER="1" ALIGN="CENTER"> <TR><TD COLSPAN="2"><A onClick="sortPlayers(pl,1)"><B>Sort</B></A></TD></TR> <TR><TD>1</TD><TD ID="Pl0"> </TD></TR> <TR><TD>2</TD><TD ID="Pl1"> </TD></TR> <TR><TD>3</TD><TD ID="Pl2"> </TD></TR> <TR><TD>4</TD><TD ID="Pl3"> </TD></TR> </TABLE> <script>showPlayers(pl)</SCRIPT> Но свойств для каждого человека не одно (age), а ещё много. Поэтому хотелось бы задавать их все в одном многомерном, желательно асоциативном массиве. Как это сделать? |
Сообщ.
#2
,
|
|
|
Многомерные массивы в JavaScript реализуются как массивы в массивах:
var players = new Array(); players[0] = new Array(); players[0][0] = "vasia"; players[0][1] = "20"; players[0][2] = "blockhead"; players[1] = new Array(); players[1][0] = "masha"; players[1][1] = "13"; players[1][2] = "profi"; Соответственно обходить все элементы надо во вложенных циклах. Объект Array имеет встроенный метод sort() который сортирует элементы масива, но он не пригоден для многомерноых массивов, поэтому надо будет изхищряться. Вот код, который сортирует массив по именам игроков. Я его не проверял - только что придумал, поэтому он может оказаться не самым эффективным. var playerNames = new Array(); //create temp array with names which will be sorted var tempArray = new Array(); //another temp array which stores info about one player var newPlayers = new Array(); //temp array which stores sorted players for (i = 0; i < players.length; i++) { //prepare playerNames for sorting playerNames[i] = players[i][0]; }; playerNames.sort(); //sort playerNames for (i = 0; i < players.length; i++) { //reconstruct players array for (j = 0; j < players.length; j++) { //find array that corresponds to playerName if (players[j][0] == playerNames[i]) { tempArray = players[j]; }; }; newPlayers[i] = tempArray; }; players = newPlayers; |
Сообщ.
#3
,
|
|
|
Вот простой пример, создания и распечатки в виде таблицы - матрицы на JS
pl=[ ["vasia",20,"blockhead"], ["masha",13,"profi"] ]; document.write("<table border=1>"); for(i=0;i<pl.length;i++) { document.write("<tr>"); for(j=0;j<pl[i].length;j++) { document.write("<td>"+pl[i][j]) } } document.write("</table>"); |
Сообщ.
#4
,
|
|
|
Спасибо. Буду юзать
|
Сообщ.
#5
,
|
|
|
объект типа Array имеет свойство sort() для сортировки по возрастанию.
А как сортировать по убыванию? |
Сообщ.
#6
,
|
|
|
делаешь сначала sort(), потом reverse() - поменять порядок на обратный
p.s. мою сортировку-то пробовал? работает? самому интересно... |
Сообщ.
#7
,
|
|
|
shipbrother, Твоя наверное работает, но я более эффективный метод юзаю.
См.: <script language="JavaScript"> var pl = new Array(4); pl[0] = new Array(); pl[0][0] = "Vasya"; pl[0][1] = 19; pl[1] = new Array(); pl[1][0] = "Petya"; pl[1][1] = 23; pl[2] = new Array(); pl[2][0] = "Kolya"; pl[2][1] = 45; function sortPlayers(pl,pos,dir) { var names = new Array(); for ( i=0; i<pl.length ; i++ ) { // prepare playerNames for sorting names[i] = pl[i][pos]; }; names.sort(); if ( dir==1 ) names.revers(); order = new Array(); for ( i=0 ; i<pl.length ; i++ ) { for ( j=0 ; j<pl.length ; j++ ) { if ( names[i] == pl[j][pos] ) { order[i]=j; } } } for ( i=0 ; i<4 ; i++ ) { var strName = 'Pl'+i; var objTD = document.getElementById(strName); objTD.innerText = pl[order[i]][0]; var strName = 'age'+i; var objTD = document.getElementById(strName); objTD.innerText = pl[order[i]][1]; } } </SCRIPT> <BODY onLoad="sortPlayers(pl,0,-1)"> <TABLE BORDER="1" ALIGN="CENTER"> <COLGROUP ALIGN="CENTER"></COLGROUP> <COLGROUP ALIGN="CENTER"></COLGROUP> <COLGROUP ALIGN="CENTER"></COLGROUP> <TR> <TD>#</TD> <TD><A onClick="sortPlayers(pl,0,1)"><B>Sort by name</B></A></TD> <TD><A onClick="sortPlayers(pl,1,1)"><B>Sort by age</B></A></TD> </TR> <TR><TD>1</TD><TD ID="Pl0"> </TD><TD ID="age0"> </TD></TR> <TR><TD>2</TD><TD ID="Pl1"> </TD><TD ID="age1"> </TD></TR> <TR><TD>3</TD><TD ID="Pl2"> </TD><TD ID="age2"> </TD></TR> <TR><TD>4</TD><TD ID="Pl3"> </TD><TD ID="age3"> </TD></TR> </TABLE> </BODY></HTML> Здесь почти полный скрипт, должно вроде работать... |
Сообщ.
#8
,
|
|
|
<TD><A onClick="sortPlayers(pl,1,1)"><B>Sort by age</B></A></TD> А может лучше <th onClick="sortPlayers(pl,1,1)">Sort by age</th> (Аттрибут href у тега <a> обязателен!) |
Сообщ.
#9
,
|
|
|
можно сделать так
<TD><A onClick="sortPlayers(pl,1,1)" href="#"><B>Sort by age</B></A></TD> |
Сообщ.
#10
,
|
|
|
1. Без атрибута HREF тэг <A тоже работает.
2. Какое отличие <TH от <TD? |
Сообщ.
#11
,
|
|
|
Цитата Budda, 9.09.04, 12:50 Без атрибута HREF тэг <A тоже работает. Спецификация требует чтобы был атрибут href Цитата Budda, 9.09.04, 12:50 Какое отличие <TH от <TD? Th - это заголовок(выделяеться жирным шрифтом и тег <b> не нужен), а Td это простая ячейка. |
Сообщ.
#12
,
|
|
|
Mixxx, весьма признателен
|
Сообщ.
#13
,
|
|
|
function sortArr(a, b) { alert("Очередной шаг сортировки"); if(a==b)return 0; else if(a<b)return -1; else if(a>b)return +1; } var array=[1, 2, 3, 4]; array.sort(sortArr); Перепиши sortArr для матрицы. |
Сообщ.
#14
,
|
|
|
Tishaishii, наверное либо я слишком тупой, либо ты слишком умный. Нельзя ли поподробнее, к чему это? Сортировка результатов функции? А параметры нужно передавать?
|
Сообщ.
#15
,
|
|
|
Как всегда, одно из двух типа Baboolean.
Процедура sort, которая, как уже shipbrother заявил, не пригодная для сортировки чего бы то ни было кроме одномерных массивов и то только по возрастанию, на самом деле очень даже пригодна, если знать и для наладки управления сортировкой используется всего-то функция, которая возвращает в нужный момент как критерий 0, -1 или 1. Проверь: function sort_1(a, b)//два элемента для сравнения { //Сравниваем массивы по элементу с номером curidx. if(a[curidx]==b[curidx])return 0; if(a[curidx]<b[curidx])return -1; return 1; } var arr1=[[1, 2, 3], [3, 2, 1], [2, 2, 4]]; var curidx=0; arr1.sort(sort_1); alert(arr1.join('\n')); //Изменим номер столбца. Теперь по второму. curidx=1; arr1.sort(sort_1); alert(arr1.join('\n')); Смотри здесь |