开始:
<table id='my-table' width='960' height='500'></table>
var data = [ { type: "Name", content: "John Doe" }, { type: "Birthdate", content: "01/01/1970" }, { type: "Salary", content: "$40,000,000" }, // ...另外300行... { type: "Favorite Flavour", content: "Sour" } ];
在循环内附加
您刚刚收到了大量数据。现在是时候遍历并在页面上呈现它了。
您首先想到的是做这样的事情:
var i; // <- the current item number var count = data.length; // <- the total var row; // <- for holding a reference to our row object // 遍历数组 for ( i = 0; i < count; ++i ) { row = data[ i ]; // 将整行放入桌子 $('#my-table').append( $('<tr></tr>').append( $('<td></td>').html(row.type), $('<td></td>').html(row.content) ) ); }
这是完全有效的,并且将完全呈现您的期望,但是...
还记得那300多行数据吗?
每个元素都会迫使浏览器重新计算每个元素的宽度,高度和位置值,以及其他任何样式-除非它们被布局边界所分隔,不幸的是,在此示例中(因为它们是<table>元素的后代),它们不能。
如果数量少而且色谱柱数少,那么这种性能损失肯定可以忽略不计。但是我们希望每一毫秒都可以计数。
更好的选择
/** * 重复的 DOM 遍历(沿着元素树向下,直到达到 * 你要找的-比如我们的<table>)也应该尽量避免。 */ // 将表缓存在变量中,然后使用它,直到您认为它已被删除为止 var $myTable = $('#my-table'); // To hold our new <tr> jQuery objects var rowElements = []; var count = data.length; var i; var row; // 遍历数组 for ( i = 0; i < count; ++i ) { rowElements.push( $('<tr></tr>').append( $('<td></td>').html(row.type), $('<td></td>').html(row.content) ) ); } // 最后,一次插入所有行 $myTable.append(rowElements);
在这些选项中,这一选项最依赖jQuery。
var $myTable = $('#my-table'); // 使用.map()方法循环 // -这将根据回调函数的结果为我们提供一个全新的数组 var rowElements = data.map(function ( row ) { // 创建一行 var $row = $('<tr></tr>'); // 创建列 var $type = $('<td></td>').html(row.type); var $content = $('<td></td>').html(row.content); // 将列添加到行 $row.append($type, $content); // 添加到新生成的数组 return $row; }); // 最后,将所有行放入表中 $myTable.append(rowElements);
在功能上等同于之前的版本,仅易于阅读。
// ... var rowElements = data.map(function ( row ) { var rowHTML = '<tr><td>'; rowHTML += row.type; rowHTML += '</td><td>'; rowHTML += row.content; rowHTML += '</td></tr>'; return rowHTML; }); // 在这里使用.join('')将所有单独的字符串合并为一个 $myTable.append(rowElements.join(''));
完全有效,但是不建议再次使用。这迫使jQuery立即解析大量文本,这是不必要的。正确使用时,jQuery非常擅长做什么。
var $myTable = $(document.getElementById('my-table')); /** * 创建一个文档片段来保存我们的列 * - 把这个添加到每一行后,它就会自动清空 * 所以我们可以在下一次迭代中重用它。 */ var colFragment = document.createDocumentFragment(); /** * 这次使用. reduce ()对数组进行循环。 * 我们得到了一个很好的,整齐的输出,没有任何副作用。 * - 在本例中,结果将是 * 包含所有<tr>元素的文档片段。 */ var rowFragment = data.reduce(function ( fragment, row ) { // 创建一行 var rowEl = document.createElement('tr'); // 创建列 and the inner text nodes var typeEl = document.createElement('td'); var typeText = document.createTextNode(row.type); typeEl.appendChild(typeText); var contentEl = document.createElement('td'); var contentText = document.createTextNode(row.content); contentEl.appendChild(contentText); // 将列添加到列片段 // -如果分别迭代列,这将很有用 // 但在此示例中,仅用于展示和讲述。 colFragment.appendChild(typeEl); colFragment.appendChild(contentEl); rowEl.appendChild(colFragment); // 将rowEl添加到片段-这充当临时缓冲区 // 批量插入之前累积多个DOM节点 fragment.appendChild(rowEl); return fragment; }, document.createDocumentFragment()); // 现在将整个片段转储到您的表中 $myTable.append(rowFragment);
我个人的最爱。这说明了jQuery在较低级别上的用途的一般概念。
问题内容: 可以说我有一个空的div: 这是: 与: 问题答案: 每当您将HTML字符串传递给jQuery的任何方法时,都会发生以下情况: 创建了一个临时元素,我们称它为x。x 设置为您传递的HTML字符串。然后,jQuery将把每个产生的节点(即x )转移到新创建的文档片段中,然后将其缓存下一次。然后,它将片段的片段作为新的DOM集合返回。 请注意,它实际上要比这复杂得多,因为jQuery进行了
我有一个结构 如果我有并且希望计算值的总和,这两种方法中哪一种是最快的? A[2]被声明为结构A的两个连续块,如下所示: 编辑 我已将大小从更改为,因为显然不理解我指的是一般情况
我有两个收藏品。 null 员额 post_id user_id 主题 正文 附件 创建_at 更新_at (User和Posts集合都有2000000个文档) null 所以我先提取过滤过的用户。 并通过过滤的用户提取帖子。 但随着服务的成长,帖子和用户数据将会增加。 这里有其他性能改进吗? 任何建议,非常感谢。
我想做的是利用我对连续负二项分布进行抽样的事实,这是得到头部所需要的试验数的分布,也就是说,如果f(X)是这个分布,那么f(X)给出了在我们遇到头部之前有X个尾部的概率,其中X不必是整数。如果我能对这个分布进行采样,那么我能做的就是,如果X是尾部的数量,那么我就能看到X是大于还是小于信用的数量;如果大于,那么我们用完所有的学分,但什么也没有发生,如果小于或等于,那么好事发生了,我们从学分的数目中减
我有数据,我想应用滚动函数来检测哪个点的值大于特定阈值。 我想要的是找到下一个2个值高于某个阈值(例如30)的行。这将产生以下结果: 我有一个大的数据集(几百万行),所以我试图找到一个有效的解决方案。也许使用?由reprex包(v0.2.1)在2019-02-26创建
问题内容: 我有一个包含三列()的表,我想知道如何 为每个lending_id检索最大的差距 。 对于以下示例: 我想知道如何检索: 因为对于71737,它将考虑从装置6到21(16),对于354226,将考虑8和15(8)之间的间隙。 问题答案: 这是一种基于模仿的方法,适用于不支持窗口功能的MySQL版本(计划将窗口功能包含在MySQL v8.x中)。 这种方法的结果将揭示有关最长序列的更多事