我创建了一个函数,它在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);
}
}
答案 0 :(得分:1)
您的循环使i
从1
转到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}中读取})