Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何最大限度地优化json到html的转换_Javascript_Jquery_Html_Json - Fatal编程技术网

Javascript 如何最大限度地优化json到html的转换

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

我有一些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(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中