【发布时间】:2015-04-23 15:28:21
【问题描述】:
我必须将大量 XML 数据解析为对象。我想到了三种将 XML 转换为对象的方法:
XML
<myXml>
<tag1 val = "someVal"/>
<tag2 val = "someVal"/>
<tag3 val = "someVal"/>
</myXml>
选项 1:使用 .find()
var xml = getMyXml();
var myObj = {
1 : xml.find('tag1').attr('val'),
2 : xml.find('tag2').attr('val'),
3 : xml.find('tag3').attr('val'),
}
选项 2:使用 .each()
var xml = getMyXml();
var myObj = {
1 : 'tag1',
2 : 'tag2',
3 : 'tag3',
}
$.each(myObj, function(i,e){
myObj[i] = xml.find(e).attr('val');
});
选项 3:数组
var xml = getMyXml();
var myArr = ['tag1','tag2','tag3']
var myObj = {};
for(var i = 0; i < myArr.length; i++){
myObj[i] = xml.find(myArr[i]).attr('val');
}
使用此性能 http://jsperf.com/each-vs-arraysdfsdf 选项 2 比其他两个选项快 82%。为什么?
【问题讨论】:
-
奇怪。我本来希望展开选项 1 最快,因为它避免了任何额外的开销。
-
我不了解底层的工作原理,但我唯一的猜测是在选项 1 中它每次都在重建对象?但是,我对选项 3 与选项 1 的速度相同感到更加困惑。
-
必须优化每个回调的内容,但我目前不知道。其他人有什么想法吗?
-
source 可能会提供一些见解。看起来
(for item in object)可能只是比for i循环快。可能值得将其添加到测试中。 -
@Jack:如果有的话,我现在几乎可以肯定地期望
$.each会更慢。一定是魔法! :)