javascript - 将行插入表中,这些行按某些值属性排序

标签 javascript jquery

我有一个简单的 HTML 表格,我想用 JQuery 向表格中插入新行。

每一行都有一个自定义的 val 属性,里面有 UNIX 时间戳,例如:

<tr data-val="1356998400"><!-- Some row content --></tr>

我想用 JQuery 插入新行,我希望它们在插入后按 val 属性排序。

明显的解决方案是将 id-s 设置为 rows 并在每次插入之前手动扫描 rows 数组(执行时间值比较)以找到正确的插入位置,但可能有更多类似 JQuery 的解决方案?我想对于这种情况应该存在一种单线解决方案。

最佳答案

最初,您可以使用基本的 sort 函数对表格进行排序(如果行尚未排序):

标记

(注意:将您的自定义 val 属性添加为数据属性)

<table>
  <tbody>
    <tr data-val="1"><td>1st</td></tr>
    <tr data-val="4"><td>3rd</td></tr>
    <tr data-val="7"><td>4th</td></tr>
    <tr data-val="2"><td>2nd</td></tr>
  </tbody>
</table>

jQuery

$('table').html(function() {
  return $(this).find('tr').sort(function(a, b) {
    return $(a).data('val') > $(b).data('val');
  });
});

对行进行排序后,您可以轻松找到插入新行的位置,方法是抓取其 data-val 大于或等于 data-val 的第一行newRow:

var $newRow = $('<tr data-val="3"><td>Between 2nd and 3rd!</td></tr>');
var elementToInsertBefore = $('tr').filter(function() {
    return $(this).data('val') >= $newRow.data('val');
}).get(0);

if (typeof elementToInsertBefore === 'undefined') {
    $('table').append($newRow);  
} else {
    $newRow.insertBefore(elementToInsertBefore);
}

因此,如果过滤器未返回 elementToInsertBefore(即没有现有行的 data-val 大于或等于 $newRow的 data-val,将其追加到表的末尾,否则将其插入到elementToInsertBefore之前。

旁注:使用 for 循环获取 elementToInsertBefore 可能更有效。这样,只要找到满足条件的行,就可以break,这样可以防止进一步不必要的迭代(在处理大量的行)。

如果您想要更详细的内容,请查看提到的 jQuery 插件。

Here's a fiddle

关于javascript - 将行插入表中,这些行按某些值属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103035/

相关文章:

jquery - HTML设计-用div替换表格

javascript - return false 或 return true 不会跳到 jQuery 中的下一个循环

javascript - 如何在nodejs中使用fs从多个目录获取文件名?

jquery - "VIDEOJS: WARN: Player "媒体 "is already initialized"当它不是

javascript - 使纹理的宽度适应其内容

javascript - Leaflet 1.0.0-rc3 removeFrom()方法导致 "is not a function"错误

javascript - 点击滑动到宽度 100%

javascript - 服务调用不会在 native react 中进行。收到类似 "Possible unhandled Promise Rejection, Reference error: response is not defined"的警告

java - 如何在android java代码中将字符串存储到文件中并在javascript中调用它进行解析

javascript - 从返回 "UNSPECIFIED_ERROR"的模板创建信封