2

Collada 文件格式包含大量数据,这些数据以空格分隔的浮点/整数/布尔值列表形式存储。这些列表可能很大。我们大致使用以下代码在 JavaScript 中解析这些列表:

var floats = input.split(' ').map(parseFloat)

但这会产生大量垃圾,因为巨大的输入字符串被分割成数千个单独的小字符串。有没有办法避免这种情况?类似于 parseFloat() 函数的东西,我可以指向现有字符串中的偏移量,从而避免生成垃圾。

4

3 回答 3

2

如果您在字符串前面加上一个空格,则可以使用它来从字符串中取出第一个数字:

var start = 0 // Initial search offset.
var firstOccurence = input.indexOf(' ', start);
//Get the substring from the first occurrence of ' ' after start, to the next one, and parse it as a float.
parseFloat(input.substring(firstOccurence , input.indexOf(' ', firstOccurence+1)));

然后,您可以使用以下内容从字符串中获取之后的数字:

firstOccurence = t.indexOf(' ', firstOccurence+1);
parseFloat(t.substring(firstOccurence , t.indexOf(' ', firstOccurence+1)));

在循环中使用它,您可以搜索您的列表,并且您可以在指定索引处开始搜索列表。但是,例如,您不能要求列表中的第 7 个浮点数。唯一可靠的方法是使用.split(' '),或在循环中使用上述代码。

要在输入中找到第nth 个浮点数,可以使用以下命令:

for(var i = 0, previousIndex = 0; i < n; i++){
    previousIndex = input.indexOf(' ', previousIndex + 1);
}
var float = parseFloat(input.substring(previousIndex, input.indexOf(' ',  previousIndex + 1)));
于 2012-11-26T11:47:17.783 回答
2

此函数可以处理多个空格以及不解析为浮点数的输入。

input = "123 123 123  foo", start = 0, end = 0, result = [], num;

// empty string evaluates to false
while( end < input.length ) {
    end = input.indexOf(" ", start );
    // -1 => only one element in input || end of the string has been reached
    if( end === -1 ) { end = input.length }
    num =  parseFloat( input.substring( start, end ) );
    // Should extracted string fail to parse then skip
    if( num ) result.push( num ); 
    // move forward or end will match current empty space
    start = end + 1;
}

result[2] // => "123";

在这里提琴

更新

刚刚有一个脑电波。不要使用 map 函数,而只需使用通过拆分字符串创建的数组,如下所示:

var floats = input.split(' ');
for( var i = 0, len = input.length; i < len; i++ ) {
    input[i] = parseFloat( input[i] );
}
于 2012-11-26T11:54:42.147 回答
1

这个怎么样?

parseFloat(input.substring(5,10));

5,10您想要的字符串块的开始和结束偏移量在哪里。

于 2012-11-26T11:36:52.087 回答