Программное объявление переменных на основе индексированного массива (работа со страницей списка сайтов google)

представьте, что у меня есть Excel-подобная сетка, состоящая из двух частей.

Столбец и список.

Столбец - это столбцы, а список - это полная коллекция всех строк. Я могу получить свой список столбцов с .length и .length в списке, который дает мне количество строк.

Итак, теперь у меня есть x и y.

Я хочу создать из этого объект, который работал бы примерно так:

var = ObjList {

    row0 = [],
    row1 = [],
    row2 = [],
    column = [],
};

Проблема в том, что список можно изменять по длине. Единственный способ приблизиться к этому - программно создавать переменные. Вроде так (псевдокод)

  //Variables
  var itemName

  //Get Column Names
  for (var j in columns) {                                 //columns is an object/array
      var cName =columns[j].getName();                     //I have to get the name otherwise cName just returns as ListItem
      columnList.push(cName);                              //Push cName to my own array so I have an array of strings
  }
  for (var i in listItems) {                              //Again working with an object array
      item  = listItems[i]                                //Creating an easier reference variable
      for (var j = 0; j < columnList.length - 1;j++){     //now I have to use the length of the Column array to find out how wide our list is
          itemName = item.getValueByName(columnList[j]);  //turning the listitem into a string
          row(i).push(itemName);                          //the is the programmatic variable. 
      }
  }

Проблема в том, что я не уверен, где бы объявить переменную. Есть ли у меня другой способ пройти через массив List и сопоставить каждый индекс массива listItems с индексом столбца, который я делаю здесь с помощью getValueByName (columnList [j]).

******************************Редактировать******************* *************

Был запрошен пример, и я вижу, насколько это сбивает с толку. Это касается конкретно сайтов Google.

Я также добавил комментарии к приведенному выше коду.

У нас есть сетка, фактически состоящая из двух частей. Столбец - это объект, поэтому я создаю еще один массив и помещаю имена в массив. Список - это еще один объект. (LI = lineItem)

 |Col1|Col2|Col3|Col4|<~~~ Column Object 
 |LI |LI |LI |LI |<~~~~~~~~~~~~~~~~~~~|
 |LI |LI |LI |LI |<~~~~~~~~~~~~~~~~~~~| List Object
 |LI |LI |LI |LI |<~~~~~~~~~~~~~~~~~~~|

Я хочу иметь возможность перебирать цикл и разбивать каждую строку на отдельный массив.

Мне удавалось делать это по одному. Но поскольку я хотел бы иметь один массив на строку, а количество строк является динамическим (потому что пользователь может добавлять больше строк), я не понимаю, как я могу это учитывать.

Я хочу, чтобы вся сетка существовала как объект со свойствами строки и свойствами столбца, которые являются массивом. Таким образом, row0 будет row0 [LI1, LI2, LI3, LI4]

 Columns[]~~>|Col1|Col2|Col3|Col4|  ~~~~~~~|
 row0[]~~~~~>|LI1 |LI2 |LI3 |LI4 |  ~~~~~~~|
 row1[]~~~~~>|LI1 |LI2 |LI3 |LI4 |  ~~~~~~~|ObjList
 row2[]~~~~~>|LI1 |LI2 |LI3 |LI4 |  ~~~~~~~|

Снова ширина сетки

Column.length 

и количество строк может быть определено

itemList.length 

Итак, я думаю, вопрос в том, могу ли я иметь массив массивов?

Так что я мог бы

 //Variables
   var itemName;
   var masterArray = [];
   var midArray = [];
  //Get Column Names
  for (var j in columns) {                                
      var cName =columns[j].getName();                     
      columnList.push(cName);                              
  }
  for (var i in listItems) {                              
      item  = listItems[i]                                
      for (var j = 0; j < columnList.length - 1;j++){    
          itemName = item.getValueByName(columnList[j]);  
          midArray.push(itemName);
              if (midArray > columnLisst.length -1) {
                 masterArray.push(midArray);
                 midArray.length = 0;
              }                      
      }
  }

Хотя это кажется неуклюжим и неправильным.


person JForgie    schedule 16.12.2014    source источник
comment
Можете ли вы пояснить некоторые примеры данных? Ваш пример вообще не имеет смысла :(   -  person thefourtheye    schedule 16.12.2014
comment
добавлено дополнительное объяснение.   -  person JForgie    schedule 16.12.2014


Ответы (1)


Да, в JavaScript может быть двухмерный массив. Теперь у вас есть объект с другим уровнем, который представляет собой массив, поэтому с точки зрения размеров действительно нет никакой разницы. Будь то объект с массивами, объект с другими объектами или массив с другими массивами; во всех ситуациях у вас есть этот второй уровень.

Единственная проблема на самом деле; вы хотите иметь доступ к значениям по имени, а не по индексу? Если вы хотите получить доступ к значениям по имени, используйте объект. Вы рассматривали возможность размещения объекта внутри объекта?

Я не вижу, чтобы вы программно объявляли переменные. Может быть неправильное понимание терминологии.

В этой ситуации, когда есть второй уровень данных, было бы нормально иметь вложенные FOR циклы, поэтому даже если это более сложно, я не думаю, что это будет считаться неуклюжим или неправильным.

Вам нужно будет запустить код и посмотреть на результаты, чтобы понять, что сработает для вас. Вы можете использовать Logger.log("some text: " + aVariableName); операторы для печати информации в ЖУРНАЛЕ, а затем ПРОСМОТР ЖУРНАЛА. Также просмотрите ТРАНСКРИПТ ИСПОЛНЕНИЯ.

Вы также можете переходить по строкам кода, по одной строке за строкой, и просматривать результаты.

Если у вас есть конкретная проблема, которую вы не можете понять, укажите сообщение об ошибке и укажите, какая строка кода вызывает сообщение об ошибке.

person Alan Wells    schedule 16.12.2014