我的函数不会在for循环中返回对象

时间:2015-09-13 11:50:41

标签: javascript

我创建了一个函数,它在XML字符串中使用了标记S的内部:

'<C><P /><Z><S>[Grounds here]</S><D /><O /></Z></C>'

,包含地面数据,显然与游戏有关。然后我消耗此内部的每个地面数据,直到我在z循环中使用i到达数字for,并将第一个/一个剩余地面的数据作为对象返回。

问题:函数返回undefined而不是object

这是功能:

/**
 * Get a string between 2 strings.
 */
String.prototype.between = function(left, right) {
    var sub = this.substr(this.lastIndexOf(left) + left.length);
    return sub.substr(0, sub.indexOf(right));
}

/**
 * @param {Number} z The inner position of the ground I want to read, e.g, 1, the first.
 */
function readGround(z) {

     // string containing all existent grounds
    var groundsData = xml.substr(STG.indexOf('<S>') + 3, STG.lastIndexOf('</S>'));

     // Iterate the grounds while z isn't reached
    for(var i = 1; i < z; i++) {

        // Get the ground inner
        var outer = groundsData.substr(groundsData.indexOf('<S') + 3, groundsData.indexOf('/>'));

        // Check if i reached z
        if(i === z) {

            // Get grounds properties
            var a = [
                outer.between('L="', '"'),
                outer.between('H="', '"'),
                outer.between('X="', '"'),
                outer.between('Y="', '"')
            ];

            return {
                L: a[0], H: a[1],
                X: a[2], Y: a[3]
            };

        // Else skip this ground
        } else groundsData = groundsData.substr(groundsData.indexOf('/>'), groundsData.length);
    }
}

1 个答案:

答案 0 :(得分:1)

您的循环使i1转到num-1。但是在循环内你有条件if(i==num)。这种情况永远不会成立,因此程序永远不会达到return语句。如果函数内部的程序流意味着没有达到return语句,那么函数只返回undefined。 (这不是特定于JavaScript的 - 类似的规则适用于许多语言。)

相反,您可以将循环中的return语句移到之外。

function readGround(num) {
    var grounds = stg.substr(stg.indexOf('<S>') + 3, stg.lastIndexOf('</S>')),
        gr;
    for (var i = 1; i < num; i++) {
        grounds = grounds.substr(grounds.indexOf('/>') + 2, grounds.length);
    }
    gr = grounds.substr(grounds.indexOf('<S') + 3, grounds.indexOf('/>'));
    var a = [stringBetween(gr, 'L="', '"'), stringBetween(gr, 'H="', '"'), stringBetween(gr, 'X="', '"'), stringBetween(gr, 'Y="', '"')];
    return {
        L: a[0],
        H: a[1],
        X: a[2],
        Y: a[3]
    };
}

(还需要调整一些其他内容以使您的代码正常工作,例如a应该从gr中的文本部分而不是从较长的字符串{{1}中读取})

jsfiddle