patternjavascriptMinor
Performance tuning on a text file to object conversion
Viewed 0 times
conversionfiletuningtextperformanceobject
Problem
I'm using an API which returns text in the following format:
I'm converting this to a list of objects:
My concern is that the API returns quite a lot of data, therefore I would like some feedback regarding on how to improve the performance.
For instance, is there any way to reduce the mapping complexity from O(N2) to O(N)?
Also, please suggest regex improvements :)
#start
#p 09060 20131010
#p 09180 AK
#p 01001 19110212982
#end
#start
#p 09060 20131110
#p 09180 AB
#p 01001 12110212982
#endI'm converting this to a list of objects:
var result = data.match(/#start[\s\S]+?#end/ig).map(function(v){
var lines = v.split('\n'),
ret = {};
$.each(lines, function(_, v2){
var split = v2.split(' ');
if(split[1] && split[2])
ret[split[1]] = split[2];
});
return ret;
});My concern is that the API returns quite a lot of data, therefore I would like some feedback regarding on how to improve the performance.
For instance, is there any way to reduce the mapping complexity from O(N2) to O(N)?
Also, please suggest regex improvements :)
Solution
If you use regular expressions for parsing, then I would recommend using them for everything. Here's a solution that proceeds line by line, using capturing parentheses to see what the line contained.
function parse(data) {
var re = /(#start)|(#end)|#p\s+(\S+)\s+(\S+)/ig;
var results = [], match, obj;
while (match = re.exec(data)) {
if (match[1]) { // #start
obj = {};
} else if (match[2]) { // #end
results.push(obj);
obj = null; // ← Prevent accidental reuse if input is malformed
} else { // #p something something
obj[match[3]] = match[4];
}
}
return results;
}Code Snippets
function parse(data) {
var re = /(#start)|(#end)|#p\s+(\S+)\s+(\S+)/ig;
var results = [], match, obj;
while (match = re.exec(data)) {
if (match[1]) { // #start
obj = {};
} else if (match[2]) { // #end
results.push(obj);
obj = null; // ← Prevent accidental reuse if input is malformed
} else { // #p something something
obj[match[3]] = match[4];
}
}
return results;
}Context
StackExchange Code Review Q#46250, answer score: 3
Revisions (0)
No revisions yet.