На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Многомерный массив в JS , Создание, сортировка?
    Есть таблица данных:

    Вот как я эти данные отображаю на экране:
    ExpandedWrap disabled
       
      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;

    ExpandedWrap disabled
       
      <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), а ещё много. Поэтому хотелось бы задавать их все в одном многомерном, желательно асоциативном массиве.

    Как это сделать?
      Многомерные массивы в JavaScript реализуются как массивы в массивах:
      ExpandedWrap disabled
         
        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() который сортирует элементы масива, но он не пригоден для многомерноых массивов, поэтому надо будет изхищряться. Вот код, который сортирует массив по именам игроков. Я его не проверял - только что придумал, поэтому он может оказаться не самым эффективным.
      ExpandedWrap disabled
         
        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;
        Вот простой пример, создания и распечатки в виде таблицы - матрицы на JS
        ExpandedWrap disabled
           
          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>");
          Спасибо. Буду юзать
            объект типа Array имеет свойство sort() для сортировки по возрастанию.

            А как сортировать по убыванию?
              делаешь сначала sort(), потом reverse() - поменять порядок на обратный :)
              p.s. мою сортировку-то пробовал? работает? самому интересно...
              Сообщение отредактировано: shipbrother -
                shipbrother, Твоя наверное работает, но я более эффективный метод юзаю.

                См.:
                ExpandedWrap disabled
                   
                  <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>

                ExpandedWrap disabled
                   
                  <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>


                Здесь почти полный скрипт, должно вроде работать...
                  ExpandedWrap disabled
                    <TD><A onClick="sortPlayers(pl,1,1)"><B>Sort by age</B></A></TD>

                  А может лучше
                  ExpandedWrap disabled
                     
                    <th onClick="sortPlayers(pl,1,1)">Sort by age</th>

                  (Аттрибут href у тега <a> обязателен!)
                    можно сделать так
                    ExpandedWrap disabled
                      <TD><A onClick="sortPlayers(pl,1,1)" href="#"><B>Sort by age</B></A></TD>
                    тогда href присутствует, но пересылать никуда не будет
                      1. Без атрибута HREF тэг <A тоже работает.
                      2. Какое отличие <TH от <TD?
                        Цитата
                        Budda, 9.09.04, 12:50
                        Без атрибута HREF тэг <A тоже работает.

                        Спецификация требует чтобы был атрибут href

                        Цитата
                        Budda, 9.09.04, 12:50
                        Какое отличие <TH от <TD?

                        Th - это заголовок(выделяеться жирным шрифтом и тег <b> не нужен), а Td это простая ячейка.
                          Mixxx, весьма признателен
                            ExpandedWrap disabled
                              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 для матрицы.
                              Tishaishii, наверное либо я слишком тупой, либо ты слишком умный. Нельзя ли поподробнее, к чему это? Сортировка результатов функции? А параметры нужно передавать?
                                Как всегда, одно из двух типа Baboolean.



                                Процедура sort, которая, как уже shipbrother заявил, не пригодная для сортировки чего бы то ни было кроме одномерных массивов и то только по возрастанию, на самом деле очень даже пригодна, если знать и для наладки управления сортировкой используется всего-то функция, которая возвращает в нужный момент как критерий 0, -1 или 1.

                                Проверь:
                                ExpandedWrap disabled
                                  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'));


                                Смотри здесь
                                Сообщение отредактировано: Tishaishii -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0373 ]   [ 15 queries used ]   [ Generated: 2.05.24, 19:55 GMT ]