我正在使用ServiceNow,我正在寻求关于for循环的一些指导。这是其中一个小部件的开箱即用代码片段:
data.f = $sp.getForm(data.table, data.sys_id, data.query, data.view);
这会产生一个类似于这样的JSON对象:
"_sections": [{
"_bootstrap_cells": 6,
"_count": 2,
"visible": true,
"columns": [{
"fields": [{
"name": "type_of_account",
"type": "field"
}, {
"name": "routing_transit_number",
"type": "field"
}]
}, {
"fields": [{
"name": "type_of_payment",
"type": "field"
}, {
"name": "check_digit",
"type": "field"
}]
}],
"caption": "Direct Deposit",
"id": "b456b9d2137ac340177c36328144b0ef",
"scope_name": "x_dnf"
}, {
"_bootstrap_cells": 12,
"_count": 1,
"visible": true,
"columns": [{
"fields": [{
"name": "account_number",
"type": "field"
}, {
"name": "account_title",
"type": "field"
}, {
"name": "financial_institution_name",
"type": "field"
}]
}],
"caption": "",
"id": "",
"scope_name": "x_dnf"
}
}]
在上面的例子中,有一个部分有一个标题,一个没有标题。我想循环遍历_sections,对于那些没有标题的人,我希望他们所有的字段都显示在上一个有标题的部分。在这个特定的例子中,前一部分碰巧有一个标题,但是可能存在一个行中有多个没有标题的部分的情况。在这种情况下,我希望所有这些没有标题的部分被推入最接近的前一部分。
有关如何实现这一目标的任何建议?
for (var s in data.f._sections) {
var sc = data.f._sections[s];
var sc_col = sc.columns;
if (sc.caption == '') {
for(var a=0; a<sc_col.fields.length; a++) {
//push fields to closest previous section that has a caption
}
}
}
其他信息
目前,上面的代码生成两个单独的选项卡,因为我在_sections上有一个ng-repeat。其中一个有标题'直接存款',另一个没有标题:
在后端,它们实际上位于一个标签中:
它们作为两个独立部分出现的唯一原因是因为前四个问题是两列,其余三个问题是一列。
我生成标签的html如下所示:
<md-tab ng-repeat="container in containers" label="{{container.captionDisplay || container.caption}}">
我的想法是采取那些没有标题的部分(因为它们不是真正独立的部分/标签),只需将它们附加到最近的带有标题的标签。
答案 0 :(得分:0)
我在fields
这里真的不太清楚你的意思。它是column
子对象的属性吗?如果是这样,一种可能性是将reduce
与累加器一起使用,该累加器既包含可能更改的项目的运行计数,也包含对具有非空caption
的最新项的引用。代码可能如下所示:
const data = [{"_bootstrap_cells": 6, "_count": 2, "caption": "Direct Deposit", "columns": [{"fields": [{"name": "type_of_account", "type": "field"}, {"name": "routing_transit_number", "type": "field"}]}, {"fields": [{"name": "type_of_payment", "type": "field"}, {"name": "check_digit", "type": "field"}]}], "id": "b456b9d2137ac340177c36328144b0ef", "scope_name": "x_dnf", "visible": true}, {"_bootstrap_cells": 12, "_count": 1, "caption": "", "columns": [{"fields": [{"name": "account_number", "type": "field"}, {"name": "account_title", "type": "field"}, {"name": "financial_institution_name", "type": "field"}]}], "id": "", "scope_name": "x_dnf", "visible": true}]
const transform = (data) => data.reduce(({lastCaptioned, all}, curr) => {
if (curr.caption) {
return {lastCaptioned: curr, all: all.concat(curr)}
} else {
lastCaptioned.columns = lastCaptioned.columns.concat(curr.columns)
delete curr.columns; // Line A
return {lastCaptioned, all: all.concat(curr)} // line B
}
}, {all: []}).all
console.log(transform(data))
&#13;
如果您不想从无字幕元素中删除这些字段,则只需删除&#34; A行&#34;。
如果您不想包含无字幕元素,请更改&#34; B行&#34;阅读更像
的内容 return {lastCaptioned, all}
如果第一个元素没有标题,这可能会失败。可以修复它以解决这个问题,但我不知道预期的行为,这可能会导致更糟糕的代码。