Collada 文件格式包含大量数据,这些数据以空格分隔的浮点/整数/布尔值列表形式存储。这些列表可能很大。我们大致使用以下代码在 JavaScript 中解析这些列表:
var floats = input.split(' ').map(parseFloat)
但这会产生大量垃圾,因为巨大的输入字符串被分割成数千个单独的小字符串。有没有办法避免这种情况?类似于 parseFloat() 函数的东西,我可以指向现有字符串中的偏移量,从而避免生成垃圾。
Collada 文件格式包含大量数据,这些数据以空格分隔的浮点/整数/布尔值列表形式存储。这些列表可能很大。我们大致使用以下代码在 JavaScript 中解析这些列表:
var floats = input.split(' ').map(parseFloat)
但这会产生大量垃圾,因为巨大的输入字符串被分割成数千个单独的小字符串。有没有办法避免这种情况?类似于 parseFloat() 函数的东西,我可以指向现有字符串中的偏移量,从而避免生成垃圾。
如果您在字符串前面加上一个空格,则可以使用它来从字符串中取出第一个数字:
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(' ')
,或在循环中使用上述代码。
要在输入中找到第n
th 个浮点数,可以使用以下命令:
for(var i = 0, previousIndex = 0; i < n; i++){
previousIndex = input.indexOf(' ', previousIndex + 1);
}
var float = parseFloat(input.substring(previousIndex, input.indexOf(' ', previousIndex + 1)));
此函数可以处理多个空格以及不解析为浮点数的输入。
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] );
}
这个怎么样?
parseFloat(input.substring(5,10));
5,10
您想要的字符串块的开始和结束偏移量在哪里。