Javascript 如何最大限度地优化json到html的转换
我有一些json数组数据,其中有数百个对象,其数据结构类似于以下内容Javascript 如何最大限度地优化json到html的转换,javascript,jquery,html,json,Javascript,Jquery,Html,Json,我有一些json数组数据,其中有数百个对象,其数据结构类似于以下内容 var json = [{"id":"123","name":"user"},{"id":"124","name":"user2"},{"id":"125","name":"user4"}] 我正在使用以下功能使用此数据(ul和li)创建下拉列表 var newhtml=$(“”); forEach(函数(e){ newhtml.append(“”+e.name+“”); }); $('ul').append(newhtm
var json = [{"id":"123","name":"user"},{"id":"124","name":"user2"},{"id":"125","name":"user4"}]
我正在使用以下功能使用此数据(ul
和li
)创建下拉列表
var newhtml=$(“”);
forEach(函数(e){
newhtml.append(“”+e.name+“ ”);
});
$('ul').append(newhtml.html())代码>这样
var json = [];
var length = 100000;
while(length--){
json.push({id: length, name: length});
}
var time = new Date().getTime();
var dropdown = document.createElement('select');
json.forEach(function(item){
var option = document.createElement('option');
option.innerHTML = item.name;
option.value = item.id;
dropdown.appendChild(option);
})
console.log(new Date().getTime() - time)
如我所见,100000个元素只需不到2秒,10000个元素大约需要180 mcs
var json = [];
var length = 100000;
while(length--){
json.push({id: length, name: length});
}
var time = new Date().getTime();
var dropdown = document.createElement('select');
json.forEach(function(item){
var option = document.createElement('option');
option.innerHTML = item.name;
option.value = item.id;
dropdown.appendChild(option);
})
console.log(new Date().getTime() - time)
正如我所看到的,100000个元素只需要不到2秒的时间,10000个大约180 mcs,如果不在最后创建元素,速度会更快。首先创建原始HTML,最后生成元素
var list = json.map(function(user){
return '<li>' + user.name + '</li>';
});
$('<div/>').html( list.join('') ).appendTo('ul');
如果直到最后才创建元素,则速度会更快。首先创建原始HTML,最后生成元素
var list = json.map(function(user){
return '<li>' + user.name + '</li>';
});
$('<div/>').html( list.join('') ).appendTo('ul');
您可以尝试将li
的完整列表放入DocumentFragment
中,并在循环完成后将其添加到DOM中。另一个解决方案是在DocumentFragment
中保留li
列表,并将其部分添加到DOM中,在这种情况下,您必须检查滚动条的位置,类似于infiti滚动条,当您到达页面底部时,会在其中添加新内容
var fragment = document.createDocumentFragment()
json.forEach(function (e) {
var li = document.createElement('li')
li.innerText = e.name;
fragment.appendChild(li)
}
ul.appendChild(fragment);
滚动示例:
var next = 50;
var ul = document.getElementById('ul');
ul.addEventListener('scroll', function(ev) {
var a = ev.target.scrollTop;
var b = ev.target.scrollHeight - ev.target.clientHeight;
if((a / b) > 0.9) {
//add next part of li's to the ul
var part = document.createDocumentFragment();
var start = next;
next += next;
[].slice.call(fragment.children, start, next).map(function(li) { part.appendChild(li); });
ul.appendChild(part)
}
});
您可以尝试将li
的完整列表放入DocumentFragment
中,并在循环完成后将其添加到DOM中。另一个解决方案是在DocumentFragment
中保留li
列表,并将其部分添加到DOM中,在这种情况下,您必须检查滚动条的位置,类似于infiti滚动条,当您到达页面底部时,会在其中添加新内容
var fragment = document.createDocumentFragment()
json.forEach(function (e) {
var li = document.createElement('li')
li.innerText = e.name;
fragment.appendChild(li)
}
ul.appendChild(fragment);
滚动示例:
var next = 50;
var ul = document.getElementById('ul');
ul.addEventListener('scroll', function(ev) {
var a = ev.target.scrollTop;
var b = ev.target.scrollHeight - ev.target.clientHeight;
if((a / b) > 0.9) {
//add next part of li's to the ul
var part = document.createDocumentFragment();
var start = next;
next += next;
[].slice.call(fragment.children, start, next).map(function(li) { part.appendChild(li); });
ul.appendChild(part)
}
});
另一个选项-构建HTML,然后更新DOM一次:
var buffer = []
$.each(json, function(key, value) {
buffer.push('<li>' + value.name + '</li>');
});
$('ul').append(buffer.join(""));
var buffer=[]
$.each(json、函数(键、值){
buffer.push(''+value.name+' ');
});
$('ul').append(buffer.join(“”));
另一个选项-构建HTML然后更新DOM一次:
var buffer = []
$.each(json, function(key, value) {
buffer.push('<li>' + value.name + '</li>');
});
$('ul').append(buffer.join(""));
var buffer=[]
$.each(json、函数(键、值){
buffer.push(''+value.name+' ');
});
$('ul').append(buffer.join(“”));
无论何时速度是一个问题:
对循环使用简单的,而不是forEach
不要将字符串与循环中的+
连接起来。相反,将项添加到数组并将其联接
例如:
var newHtml = [];
for(var j=0, jsonLen=json.length; j<jsonLen; j++){
newHtml.push('<li>'+json[j].name+'</li>')
}
$('ul').append(newHtml.join(''));
var newHtml=[];
对于(var j=0,jsonLen=json.length;j当速度是一个问题时:
对循环使用简单的,而不是forEach
不要将字符串与循环中的+
连接起来。相反,将项添加到数组中并将它们连接起来
例如:
var newHtml = [];
for(var j=0, jsonLen=json.length; j<jsonLen; j++){
newHtml.push('<li>'+json[j].name+'</li>')
}
$('ul').append(newHtml.join(''));
var newHtml=[];
对于(var j=0,jsonLen=json.length;j迭代一次,添加到简单字符串并插入一个快照
var选项=”;
for(var i=0;i”+json[i]。名称+“”
}
$('ul')。附加(选项);
迭代一次,添加到简单字符串并插入一个快照
var选项=”;
for(var i=0;i”+json[i]。名称+“”
}
$('ul').append(options);
一次显示1000多个项目有多大用处?您可以将它们分解并按需显示-自动完成搜索,单击第一个字母链接吗?如果不将每个项目推入数组,则加入以获取HTML字符串,然后一次性设置HTML()/innerHTML会更快。使用for循环和本机方法(=无jQuery)可能会加快速度。但是如果有大量新的HTML要添加到DOM中,你就无能为力了,如果你想在单个块中附加所有HTML,那么从浏览器解析所有HTML都需要一些时间。使用web worker并在块中附加数据…假设每次500个…通过侦听消息event实际上我想一次附加所有数据d选项选择其中一个,我还将为用户提供搜索选项1000个项目对于用户来说太多了,无法进行视觉过滤。一次显示1000多个项目有多大用处吗?您可以将它们分解并按需显示-自动完成搜索,单击第一个字母链接吗?如果不将每个项目推到一个数组中,则加入以获得HTML字符串,然后一次性设置HTML()/innerHTML会更快。使用for循环和本机方法(=无jQuery)可能会加快速度。但是如果有大量新的HTML要添加到DOM中,你就无能为力了,如果你想在单个块中附加所有HTML,那么从浏览器解析所有HTML都需要一些时间。使用web worker并在块中附加数据…假设每次500个…通过侦听消息event实际上我想一次附加所有数据d选项选择其中一个,我还将为用户提供搜索选项1000个项目对用户来说太多了,用户无法从一开始就进行视觉过滤选项元素没有innerHTML
。请提供校对链接。@degr我认为这对我没有多大帮助,因为它几乎使用了相同的链接way@Teemu酷,请阅读OOP和真正的问题可能是OP没有选项,也没有选择,而是无序列表?option
元素没有innerHTML
.prooflink,请。@degr我认为这对我没有多大帮助,因为它几乎使用相同的way@Teemu酷,请阅读OOP,真正的问题可能是OP没有选项,也不是select,而是无序列表?因为性能是个问题,我们是否需要映射和连接来进行2次遍历,您可以通过一次遍历来进行连接。div
仅用于存储标记,它实际上并没有附加到ULN。性能是个问题,我们是否需要映射和连接来进行2次遍历遍历时,您可以对进行一次遍历,以便在一次遍历中连接。div
仅用于存储标记,而不是实际附加到ULNK中