[英]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.