簡體   English   中英

將對象的新對象作為 arrays 添加到數組

[英]Adding new objects of objects as arrays to an array

我整天都在抓撓我的一天來解決這個問題。 javascript 的新手我需要為我的團隊使用 GAS 制作一個 WebApp,但我一直在構建我的對象 / arrays。

我有 2 個數據源(谷歌表)。 第一個數據源是一個經典的 2D 數組,稱為dbProject ,它在輸出時給出以下結構:{{...},{...},{...},{...},...}。 project[0]例如返回{id: “id0”, projectCreatedBy: “fred”}

這些項目中的每一個都有至少一個階段的最小值,但可以有更多。 每個階段的結構相似。 在此示例中,一個階段包含后勤和團隊信息。

第二個數據源dbPhase記錄與 1 個項目階段相關的項目事件,例如向項目添加新階段、向階段添加團隊成員或后勤信息等……該數據源的結構不如第一個數據源,與此類似(抱歉格式錯誤):

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

0 % 0 % 0 % 階段 % title00 % aDate00 % bDate00 % status0

1 % 0 % 0 % 團隊 % 弗雷德 % mng % 弗雷德@ % 空 % 空

2 % 0 % 0 % 團隊 % nick % wkr % nick@ % empty % empty

3 % 1 % 0 % 階段 % title10 % aDate10 % bDate10 % status0

4 % 1 % 0 % 物流 % ny % 美國 % NA % 空 % 空

5 % 1 % 1 % 階段 % title11 % date11 % date11 % status0

6 % 0 % 1 % 物流 % par % FR % EU % empty % empty

7 % 1 % 1 % 團隊 % 麥克 % 小時 % 麥克@ % 空 % 空

數據是按時間添加到表中的(最后一行的最新事件),這意味着無法對其進行排序以重新排列它。 每行代表給定項目的給定階段的事件,我決定通過為每個“typeOfEvent”代碼創建一個 object 來構建它。 我的對象編碼如下:

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 代碼並動態調用合適的 object 和屬性(上述之一),然后將其“添加”到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 and 5: 添加一個新階段。同樣,這只會保留來自 id*5; ...) 的信息。

我的查詢:我希望有這樣的結構:

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

例如:dbProjects(0).phase(1).logistic.pt1 返回“ny” 例如:dbProjects(0).phase(0).team.pt2 返回 {fred@; 數組缺口@}

我已經使用 javascript 一個月了,還沒有掌握 Arrays、對象等之間的所有差異......整天都在嘗試各種事情(推、分配、括號、括號......)並且拼命在 web 上搜索沒有成功(可能沒有使用正確的措辭)。 我也一直在查看以下帖子,認為答案會隱藏在那里。 但是,我不知道如何為我的案例安排這些解決方案(我一直認為如果可以對 dbPhase 表進行排序會更容易 - 但它不能)。

Angular2, Typescript: Add an object to an object array of an object array of an object

將新的 object 添加到另一個對象的 object

我也許可以進行快速而骯臟的循環和排序以動態推送結果? 但理想情況下,我更喜歡干凈的代碼。 您的幫助將非常受歡迎。 提前感謝您的提示。

基於

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 是您希望將該特定日志與其他相同類型的日志區分開來的方式。 第二個數據源中的每個新日志是否都有唯一的 id(指的是日志,而不是項目 id)? 那將是一個很好的鍵,否則,如果您只是添加數字鍵,則使用數組並將其重寫為更有意義

//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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM