ServiceNow 从数组中检索对象

ServiceNow retrieving objects from array

我在 ServiceNow 工作,遇到有关对象、数组以及如何访问元素的业余编码问题。下面,我从一个空数组开始并用对象填充它。现在我有了一个包含对象的数组,我的问题是如何访问不同的元素?我希望能够生成一个 table,其中列是数字、short_desc 和 url,并且行是动态生成的。我怎样才能做到这一点?

data.list = [];
var ka = new GlideRecord('x_81991_knowledge');
    ka.addQuery('kb_category.label', 'Benefits');
    ka.query();
        while(ka.next()) {
            data.list.push({
                number: ka.getValue('number'),
                short_desc: ka.getValue('short_description'),
                url:'kb_view.do?sysparm_article=' + ka.getValue('number')
          });
}

所以,您有一个对象:data,并且在该对象中有一个元素:list。该元素是一个数组,其中包含其他对象。

正如 JavaScript 中的对象包含带名称的属性一样,数组就像具有属性的对象一样,这些属性都具有按顺序编号的名称。

例如,如果您有一个像 var fruitz = ['apple', 'banana', 'hammer', 'pear']; 这样的数组,它与拥有一个如下所示的对象非常相似:

var fruitz = {
    0:'apple',
    1:'banana',
    3:'hammer',
    4:'pear'
};

在任一示例中,您都可以通过以下方式访问值为 'banana' 的元素:fruitz[1];

当然有一些差异 - 当然,对象通常不具有具有连续数字名称的属性! - 这只是一种可视化如何访问数组元素的好方法。

JS 中的数组元素 do 保留它们的顺序,因此位置 3 的元素(第四个元素 - 记住,数组使用 "zero-based index")将保留在位置3.

您可以执行 for 循环来迭代并从数组中获取元素,如下所示:

var i;
for (i = 0; i < fruitz.length; i++) {
    gs.info(fruitz[i] + ' is element number ' + i + ' in the array.');
}

网上有一些很好的学习资源Angular,如果您想了解服务门户在前端的工作原理,这绝对是至关重要的。

下面是一个如何将数组输出为平面数组的示例 table。 运行这个作为"background script",因为它使用"gs.print"来输出结果。请注意,我必须添加第一行,只是在脚本中设置 "data" 对象,但如果它已经存在于您的代码中,则不需要它。

var data = {}

data.list = [];
var ka = new GlideRecord('x_81991_knowledge');
    ka.addQuery('kb_category.label', 'Benefits');
    ka.query();
        while(ka.next()) {
            data.list.push({
                number: ka.getValue('number'),
                short_desc: ka.getValue('short_description'),
                url:'kb_view.do?sysparm_article=' + ka.getValue('number')
          });
}

for(var i=0; i < data.list.length; i++){
   gs.print("Number: " + data.list[i].number + ", Short Description: " + data.list[i].short_desc + ", URL: " + data.list[i].url);
}

这是使用带有数组的 obj 获取数据的方法:

data = []; // array
var ka = new GlideRecord('x_81991_knowledge');
ka.addQuery('kb_category.label', 'Benefits');
ka.query();
while (ka.next()) {
    var list = {}; // object
    list.number = ka.getValue('number');
    list.short_desc = ka.getValue('short_description');
    list.url = 'kb_view.do?sysparm_article=' + ka.getValue('number');
    data.push(list);
}

此外,如果您想在 servicenow 中获取记录的 url,我建议您使用 ka.getLink()。参考:getLink()