[英]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
我也許可以進行快速而骯臟的循環和排序以動態推送結果? 但理想情況下,我更喜歡干凈的代碼。 您的幫助將非常受歡迎。 提前感謝您的提示。
基於
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.