数组索引的问题

时间:2012-12-17 17:41:21

标签: javascript xml ajax arrays

所以我会直接跳到它...... 我是一名测试自动化工程师,我正在制作一个由JSON驱动的“关键字驱动”测试系统,它与Selenium测试相结合,可以在网络浏览器上运行。

“关键字”存储为XML文件,我有一个JavaScript函数,可以将这些关键字加载到数组中,还可以存储该关键字的索引。到paf.keywordIndex

实施例


$.get("getSteps.php", function(keywords) {
            paf.keywords = eval(keywords); // stores into an array...

            paf.keywordIndex = -1;
            for ( var i = 0 ; i < paf.keywords.length ; i++ ) {

                // for each path...
                /* alert(paf.keywords[i]); */

                $.ajax({url: "./_keywords/" + paf.keywords[i], success: function(xml) {         
                    paf.xml = xml;

                    paf.keywordIndex++;
                    var title = $(xml).find("keyword").attr("title");
                    //var name = $(xml).find("keyword").attr("name");

                    paf.buffer += ("<option value=\"./_keywords/"+paf.keywords[paf.keywordIndex]+"\">"+title+"</option>");
                },
                async: false
                //cache: false
                });

            }

            $(stepSelectionLocator).html(paf.buffer);
        });

getSteps.php是一个php服务,它返回json数组中的所有xml关键字。例如 ["Login.xml","EndSession.xml", "SelectResult.xml", etc...]


现在这个功能有效,但唯一的问题是,它没有以任何方式排序。所以输出将是 -

  • 登录(Login.xml)
  • 选择结果(SelectResult.xml)
  • 结束会话(EndSession.xml)

要解决此问题,我在<keyword>添加了一个额外属性,所以现在<keyword area="basic">表示这是一个基本步骤。现在我的功能是 -

$.get("getSteps.php", function(keywords) {
            paf.keywords = eval(keywords); // stores into an array...

            paf.keywordIndex = -1;
            for ( var i = 0 ; i < paf.keywords.length ; i++ ) {

                // for each path...
                /* alert(paf.keywords[i]); */



                $.ajax({url: "./_keywords/" + paf.keywords[i], success: function(xml) {         
                    paf.xml = xml;

                    paf.keywordIndex++;
                    var title = $(xml).find("keyword").attr("title");
                    var area = $(xml).find("keyword").attr("area");
                    //var name = $(xml).find("keyword").attr("name");

                    paf.buffer.push(area.toUpperCase() + ": " + title);
                },
                async: false
                //cache: false
                });

            }

            paf.buffer.sort(); // array is sorted...



            paf.buffer2 = "";
            paf.keywordIndex = -1;
            for ( var a in paf.buffer ) {
                paf.keywordIndex++;
                paf.buffer2 += "<option value=\"./_keywords/"+paf.keywords[paf.keywordIndex]+"\">"+ paf.buffer[a] + "</option>"; 
            }

            $(stepSelectionLocator).html(paf.buffer2.toString().replace(",", ""));
        });

现在输出

  • BASIC:结束会话(Login.xml)
  • BASIC:登录(SelectResult.xml)
  • 结果:选择结果(EndSession.xml)


所以我已经确定索引是问题所在。但是,我无法找到解决这个问题的方法..

我愿意接受其他选择,所以如果你找到一种更简单的方法来索引这个,请告诉我!

1 个答案:

答案 0 :(得分:1)

首先,很高兴知道完全您从初始请求中获得的数据。

$.get("getSteps.php", function (keywords) {
    paf.keywords = JSON.parse(keywords); // eval is bad! Use JSON.parse instead.
    console.log(paf.keywords); // what does it output in the console?
    ...

其次,您可以仅使用i变量来引用当前索引。如果您不在其他地方使用paf.keywordIndex,则可以删除它,因为它是多余的。

第三,你绝对肯定是100%确定你的ajax请求 * S * ynchronous? 如果不是 - 响应将随机到达,整个过程将需要采用不同的方法。

最后,如果您希望在完成所有关键字之后对您的关键字应用排序,我建议将它们作为对象推送到缓冲区数组中:

buffer.push({
    keyword: keywordName, // this is the keyword name
    keywordIndex: i, // this is the initial index
    keywordArea: areaObtainedFromXML // this is the area you get from xml
});

通过使用上述方法,您可以在保留初始订单的同时以多种方式对缓冲区进行排序。

请在 this jsfiddle 上查看一个人为的例子。