检索数组JS中的所有对象

时间:2017-03-21 21:01:08

标签: javascript dynamic-arrays servicenow

我在ServiceNow工作并尝试设置一个数组,用于检索与用户相关的所有知识文章。我的下面的代码只返回其中一篇文章,我不确定为什么......有什么建议吗?

var kaArray = [];
var ka = new GlideRecord('my_knowledge');
ka.addQuery('workflow_state', 'Published');
ka.addQuery('kb_category.label', 'Benefits');
ka.addQuery('occ_series', 'CONTAINS', occ)
  .addOrCondition('location', 'CONTAINS', loc)
  .addOrCondition(
    ka.addNullQuery('location') && ka.addNullQuery('occ_series')
  );    
ka.orderByDesc('sys_updated_on');
ka.query();
while(ka.next()) {
    obj = {number: ka.number.toString(),
           short_desc: ka.short_description.toString(),
           url: 'kb_view.do?sysparm_article=' + ka.number}; 
    kaArray.push(obj);
}

1 个答案:

答案 0 :(得分:2)

我推荐了几件事,其中一件可能是您问题的解决方案。

  1. 你正在使用"&&",一个条件运算符,以便......我担心我不完全确定。您不能以您尝试的方式在JavaScript中执行此操作。此外,由于.addOrCondition()未返回您希望用作bool的值,因此无法正常工作。相反,只需将下一个命令放在下一行。我会在底部向您展示代码的完整版本。

  2. 而不是.addNullQuery()addQuery()和.addOrCondition()调用的这些复杂序列,只需导航到您对过滤感兴趣的表格,并逐字构建过滤器在条件构建器中。然后,右键单击最终过滤器痕迹,然后单击"复制查询",然后使用.addEncodedQuery()。像这样:

  3. copy query     gr.addEncodedQuery(' short_descriptionLIKEeclipse ^ kb_category = c78a2d2047b002007f47563dbb9a71bf ^ workflow_state =已发布' / 点击"复制查询" /)的结果;

    1. 您为什么使用范围内的应用和自定义表格?如果您计划在市场上列出该范围的应用程序是有意义的,但根据表名称,它听起来像是针对特定企业。我推荐一个全球应用程序,如果有的话。我还非常强烈地建议,无论是范围的还是全局的,您只是创建一个新的知识库而不是创建一个全新的表,除非您在此KB上需要一些高级功能,并且愿意牺牲大量的获得它的OOB功能。不说你做了什么是错的,只是想确保你已经意识到你可能为自己创造的麻烦。 :-)

    2. 从我所看到的情况来看,你不能用你的CURRENT配置担心JavaScript的传递参考特质,我不认为你声明了#34;物镜"任何地方。您可能想要这样做,并给它一个更好的名称。您可能希望将该对象的添加功能添加到数组中。如果#5不对,那问题很可能是由于我错过了一个pass-by-ref问题,至少我的猜测是这样。我可以看到你在while循环中的第三行至少有一个pass-by-ref问题:

      url:' kb_view.do?sysparm_article =' + ka.number};

    3. 始终使用" getter和setter"。也就是说,当你想要一个GlideRecord的值时,永远不要直接引用gr.fieldName。相反,请使用gr.getValue('fieldName');。作为一种替代方案(我不喜欢但没有理性的理由)你也可以使用.toString(),就像你在其他一些地方一样。这显式地将值转换为字符串而不是它所在的Object(GlideElement对象)。我不是很喜欢这个,因为这意味着你强行将一个OBJECT强制转换为一个STRING。这样做没有EASY路径,因此它依赖于GlideElement类的内置方法来覆盖大多数其他类型的.toString方法。

      1. 我打赌这个查询,无论如何写的方式,只返回一条记录。您可以在查询后使用gs.info('Looking through ' + ka.getRowCount() + ' records.');之类的内容轻松测试。
      2. 对你而言,我谦卑地推荐" Learning ServiceNow"。完全披露,这是我自己的书。也就是说,我已经为那些完全具备您的知识和经验水平的人量身定制了这本书 ,我认为你会从中获得很多。大多数SN开发者会从中获得很多,但我认为你处于一个特定的位置,可以充分利用它。 我知道它说的是6月9日,但这应该在本月底或在那之后的几天内发布。

        这是我认为您尝试做的一个版本,应该有效。我确定查询需要稍微调整 - 我不得不猜测你的目的,但我认为^ NQ的使用最接近你想要完成的。就像我说的那样,只需在表上构建查询,然后将其复制到encQuery(并替换我现有的逻辑/从buildEncQuery返回正确的查询)。 这是:

         /**
         * encQuery will hold the temporary and final encoded query strings, which will look something like this (when finished):
         * "workflow_state=published^kb_category.label=Benefits^federal_occ_seriesLIKEOCC_HERE^ORlocationLIKELOC_HERE^NQworkflow_state=published^kb_category.label=Benefits^locationISEMPTY^federal_occ_seriesISEMPTY"
         * @type {String}
         */
        var encQuery = buildEncQuery(occ, loc); //occ and loc were used in your original queries, so I assume they're variables that are available to you in this scope at this point in your script. 
        /**
         * An array of objects, each containing data about knowledge articles returned from our query using encQuery.
         * @type {{name: string, short_desc: string, url: string}[]}
         */
        var knowledgeArray = [];
        /**
         * The GR we're iterating over
         * @type {GlideRecord}
         */
        var knowledgeGR = new GlideRecord('x_81991_federal_hc_federal_knowledge');
        knowledgeGR.addEncodedQuery(encQuery);
        knowledgeGR.orderByDesc('sys_updated_on');
        knowledgeGR.query();
        while (knowledgeGR.next()) {
            knowledgeArray.push({
                             number:     knowledgeGR.getValue('number'),
                             short_desc: knowledgeGR.getValue('short_description'),
                             url:        'kb_view.do?sysparm_article=' + knowledgeGR.getValue('number')
                         });
        }
        gs.info('Located ' + knowledgeGR.getRowCount() + ' records. Array length: ' + knowledgeArray.length + '.');
        //Done
        
        /**
         * Builds the encoded query for the calling function.
         * @param occ {*}
         * @param loc {*}
         * @returns {string}
         */
        function buildEncQuery(occ, loc) {
            if (occ === undefined || loc === undefined) {
                return;
            }
            var encQuery = 'workflow_state=published^kb_category.label=Benefits'
            encQuery += '^federal_occ_seriesLIKE' + occ + '^ORlocationLIKE' + loc + '^NQ' + encQuery + '^locationISEMPTY^federal_occ_seriesISEMPTY';
            return encQuery;
        }
        
        编辑:我注意到你在StackOverflow中发布了很多内容。但是,您似乎无法将问题标记为已回答的问题。我建议您这样做,但我也建议您查看sndevs.slack.com。它是其他ServiceNow开发人员的一个很好的社区。