Добавление новых объектов объектов в виде массивов в массив - PullRequest
1 голос
/ 13 июля 2020

Я целый день копаюсь, чтобы понять это. Впервые в javascript Мне нужно создать WebApp с использованием GAS для моей команды, и я застрял в построении своих объектов / массивов.

У меня есть 2 источника данных (таблицы Google). Первый источник данных - это классический c 2D-массив с именем dbProject, который при консольировании дает следующую структуру: {{…}, {…}, {…}, {…},…}. Например, project[0] возвращает {id: “id0”, projectCreatedBy: “fred”}.

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

Второй источник данных dbPhase записывает события проекта, относящиеся к фазе 1 проекта, такие как добавление новой фазы в проект, добавление членов команды или логистика c информация о фазе и т. д. Этот источник данных менее структурирован, чем первый, и похож на этот (извините за плохое форматирование):

Id *% projectId% phaseId% typeOfEvent% pty1% pty2% pty3% pty4

0% 0% 0% phase% title00% aDate00% bDate00% status0

1% 0% 0% team% fred% mng% fred @% empty% empty

2% 0% 0% team% nick% wkr% nick @% empty% empty

3% 1% 0% phase% title10% aDate10% bDate10% status0

4 % 1% 0% логистика% ny% US% NA% empty% empty

5% 1% 1% phase% title11% date11% date11% status0

6% 0% 1% логистика % par% FR% EU% empty% empty

7% 1% 1% team% mike% hr% mike @% empty% empty

Данные добавляются в таблицу на временной основе (самое последнее событие в последней строке), что означает, что их нельзя отсортировать для изменения порядка. Каждую строку, представляющую событие для данной фазы данного проекта, я решил структурировать, создав объект для каждого кода typeOfEvent. Мои объекты закодированы следующим образом:

function phase(){
this.title = ‘ ’ ;
this.aDate = ‘ ’ ;
this.bDate = ‘ ’ ;
this.status = ‘ ’ ;
}


function logistics (){
phase.call(this);
    this.address = ‘ ’;
    this.city = ‘ ’;
    this.continent = ‘ ’;
}
logistics.prototype = Object.create(phase.prototype);
logistics.prototype.constructor = logistics;


function team(){
    phase.call(this);
    this.name = ‘ ’;
    this.role = ‘ ’;
this.email = ‘ ’;
}
team.prototype = Object.create(project.prototype);
team.prototype.constructor = team;

Внутри dbPhase.map() я читаю код typeOfEvent и динамически вызываю подходящий объект и свойство (одно из приведенных выше), а затем «добавляю» его. на dbProject следующим образом:

dbPhase.map(function (row){

     //oObject is one of the above structure
     eval("var myObject = new " + oObject);

     for (var property in myObject) {
              eval('myObject.' + property + " = row[" + property + "]");  
     };

     dbProject[idProject]][typeOfEvent] = myObject

}

Это работает нормально, пока структурированные объекты не складываются, и в этом случае они переопределяют предыдущие (например, id * 2 и 3: добавление typeOfEvent для того же паттерна проекта / фазы. Это сохранит только информацию id * 3; id * 3 и 5: добавление новой фазы. Опять же, это сохранит только информацию из id * 5;…).

Мой запрос: я хочу sh иметь такую ​​структуру:

dbProjects (idProject) .phase (idPhase) .typeOfEvent.property?

ex: dbProjects (0) .phase (1) .logisti c .pt1, чтобы вернуть «ny», например: dbProjects (0) .phase (0) .team.pt2, чтобы вернуть массив {fred @; nick @}

Я использую javascript только месяц и еще не освоил все различия между массивами, объектами и т. д. c ... Целый день пробовал разные вещи ( pu sh, assign, скобки, круглые скобки, ...) и отчаянно безуспешно искать в Интернете (возможно, не используя правильную формулировку). Я также просматривал следующие посты, полагая, что ответы там скроются. Однако я понятия не имею, как организовать эти решения для моего случая (я продолжаю думать, что было бы намного проще, если бы таблица dbPhase могла быть отсортирована - но это невозможно).

Angular2, Typescript: Добавить объект в массив объектов массива объектов объекта

Добавить новый объект в объект другого объекта

Возможно, я мог бы сделать быстрые и грязные циклы а сортировки динамически по sh результатам? Но в идеале я бы предпочел чистый код. Ваша помощь будет более чем приветствоваться. Заранее благодарим за советы.

1 Ответ

0 голосов
/ 13 июля 2020

на основе

dbProjects(idProject).phase(idPhase).typeOfEvent.property

Кажется, вы хотите сохранить его как вложенные объекты, а не добавлять внутренний массив?

Таким образом, dbProject будет отображаться как

const dbProject = {
  "id0": {
    phase: {}, 
    logistics: {}, 
    team: {}
  },
  "id1": {
    phase: {}, 
    logistics: {}, 
    team: {}
  },
  ...
}

В этом случае

dbProject[idProject]][typeOfEvent] = myObject

следует переписать как

//first line not needed if hard coded as default
if(!dbProject[idProject]][typeOfEvent]) dbProject[idProject]][typeOfEvent] = {};
dbProject[idProject]][typeOfEvent][yourKey] = myObject

yourKey - это то, как вы хотите отличить guish, которые указывают c журнал от других тех же тип. Имеет ли каждый новый журнал во втором источнике данных уникальный идентификатор (тот, который относится к журналу, а не к идентификатору проекта) ?. Это был бы хороший ключ для использования, в противном случае, если вы просто добавляете числовые ключи, было бы разумнее использовать массив и перезаписать его как

//first line not needed if hard coded as default
if(!dbProject[idProject]][typeOfEvent]) dbProject[idProject]][typeOfEvent] = [];
dbProject[idProject]][typeOfEvent].push(myObject);

Получившийся dbProject теперь выглядит как

const dbProject = {
  "id0": {
    phase: [], 
    logistics: [], 
    team: []
  },
  "id1": {
    phase: [], 
    logistics: [], 
    team: []
  },
  ...
}

и каждый журнал доступен как

dbProject[idProject][typeOfEvent][index]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...