关于for循环逻辑的建议

时间:2018-02-14 17:49:24

标签: javascript json for-loop servicenow

我正在使用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。其中一个有标题'直接存款',另一个没有标题:

enter image description here

enter image description here

在后端,它们实际上位于一个标签中:

enter image description here

它们作为两个独立部分出现的唯一原因是因为前四个问题是两列,其余三个问题是一列。

我生成标签的html如下所示:

 <md-tab ng-repeat="container in containers" label="{{container.captionDisplay || container.caption}}">

我的想法是采取那些没有标题的部分(因为它们不是真正独立的部分/标签),只需将它们附加到最近的带有标题的标签。

1 个答案:

答案 0 :(得分:0)

我在fields这里真的不太清楚你的意思。它是column子对象的属性吗?如果是这样,一种可能性是将reduce与累加器一起使用,该累加器既包含可能更改的项目的运行计数,也包含对具有非空caption的最新项的引用。代码可能如下所示:

&#13;
&#13;
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;
&#13;
&#13;

如果您不想从无字幕元素中删除这些字段,则只需删除&#34; A行&#34;。

如果您不想包含无字幕元素,请更改&#34; B行&#34;阅读更像

的内容
    return {lastCaptioned, all}

如果第一个元素没有标题,这可能会失败。可以修复它以解决这个问题,但我不知道预期的行为,这可能会导致更糟糕的代码。