按隐藏输入对表进行排序

Table sorting by hidden input

本文关键字:排序 隐藏 输入      更新时间:2023-09-26

我想按价格对表格进行排序,但价格可能出现在字符串中:

例如:Starting from $75today only: $25$100等。

唯一的常量模式是排序值旁边始终$符号。

起初,我尝试使用 tablesorter jquery 插件,添加了一个自定义解析器并达到了这个小提琴。

但是为了使用这种方法,似乎我必须让用户选择稍后自行对表进行排序,这是我不想要的。否则,如果我将所有排序器设置为 false ,我无法使用自定义money解析器对其进行排序。

因此,我

开始使用隐藏输入,该输入将仅包含我想要排序的数值。我不知道这是否是一种好的做法,而且它需要我将其作为附加行添加到每个相关单元格中,我宁愿通过,就像在这个小提琴中一样。

然后我意识到可能根本不需要使用tablesorter插件,因为我可以用更少的代码获得这个结果,就像在这个小提琴中一样,这是我当前的代码。

当前代码:

.JS:

function sortNum(a, b) {
    var aVal = 1 * $(a).find("input[name='price']").val();
    var bVal = 1 * $(b).find("input[name='price']").val();
    if(aVal == 0)
        return 1;
    else if(bVal == 0)
        return -1;
    else
        return aVal < bVal ? -1 : 1;
}
function sortTheTable(){
    $(function() {
        var elems = $.makeArray($('tr:has(.sort)').remove())
        elems.sort(sortNum);
        console.log(elems);
        $("#sortme").append($(elems));
    });
}
sortTheTable();

.HTML:

<table id="sortme">
    <tr>
        <th>name</td>
        <th>price</td>
    </tr>
    <tr>
        <td>a</td>
        <td class="sort">Only 5 <input type="hidden" name="price" value="5"/></td>
    </tr>
    <tr>
        <td>b</td>
        <td class="sort">$3 <input type="hidden" name="price" value="3"/></td>
    </tr>
    <tr>
        <td>c</td>
        <td class="sort">$8 <input type="hidden" name="price" value="8"/></td>
    </tr>
    <tr>
        <td>c</td>
        <td class="sort">0 <input type="hidden" name="price" value="0"/></td>
    </tr>
    <tr>
        <td>h</td>
        <td class="sort">2 <input type="hidden" name="price" value="2"/></td>
    </tr>
    <tr>
        <td>p</td>
        <td class="sort">6 <input type="hidden" name="price" value="6"/></td>
    </tr>
    <tr>
        <td>b</td>
        <td class="sort">20 <input type="hidden" name="price" value="20"/></td>
    </tr>
    <tr>
        <td>b</td>
        <td class="sort">0 <input type="hidden" name="price" value="0"/></td>
    </tr>
</table>

主要问题:

如何使代码仅对具有隐藏输入的行进行排序(或您建议使代码尽可能更好的任何更好的做法),而不是按具有class="sort"的单元格进行排序(我不想使用此类)。

我尝试切换:

var elems = $.makeArray($('tr:has(.sort)').remove())

到:

var elems = $.makeArray($('tr:has(input[name='price'])').remove())

但它不起作用。

另外,一般来说,如果你能想出一个更好的方法来做我正在尝试做的事情,而不必使用隐藏的输入,请告诉我。这是一种可以接受的做法吗?通常我只看到表单中使用的输入。

在尝试$('tr:has(input[name="price"])')时仅选择具有隐藏input tr元素,并将sortNum函数更改为:

function sortNum(a, b) {
    var aVal = 1 * $(a).find("input[name='price']").val();
    var bVal = 1 * $(b).find("input[name='price']").val();
    return aVal - bVal;
}

这应该可以正常工作:JSFiddle

您在 Array.sort 中使用的比较函数sortNum错误,如文档所述:

如果提供了比较函数,则对数组元素进行排序 根据比较函数的返回值。如果 a 和 b 是 然后比较两个要素:

  • 如果compareFunction(a, b)小于 0,则排序a到比 b 低的索引,即 a 排在第一位。
  • 如果compareFunction(a, b)返回 0,则保持 ab 彼此不变,但相对于所有不同的 元素。
  • 如果 compareFunction(a, b) 大于 0,则b排序为低于 a 的索引。
  • 当给定一对特定的元素ab作为其两个参数时,compareFunction(a, b)必须始终返回相同的值。如果 返回不一致的结果,则未定义排序顺序

但是您的函数不遵守此规则。例如,如果a = b则返回1 0 的插入,因为它们是相等的。

我的建议仅使用 jQuery 和 js 排序来最小化代码并加快速度是:

$(function () {
  $('#sortme tr:has(input[name="price"])').sort(function(a, b) {
    return 1 * $(a).find("input[name='price']").val() - 1 * $(b).find("input[name='price']").val();
  }).appendTo('#sortme');
});
<script src="http://code.jquery.com/jquery-1.11.3.js"></script>
<table id="sortme">
    <tr>
        <th>name</td>
        <th>price</td>
    </tr>
    <tr>
        <td>a</td>
        <td class="sort">Only 5 <input type="hidden" name="price" value="5"/></td>
    </tr>
    <tr>
        <td>b</td>
        <td class="sort">$3 <input type="hidden" name="price" value="3"/></td>
    </tr>
    <tr>
        <td>c</td>
        <td class="sort">$8 <input type="hidden" name="price" value="8"/></td>
    </tr>
    <tr>
        <td>c</td>
        <td class="sort">0 <input type="hidden" name="price" value="0"/></td>
    </tr>
    <tr>
        <td>h</td>
        <td class="sort">2 <input type="hidden" name="price" value="2"/></td>
    </tr>
    <tr>
        <td>p</td>
        <td class="sort">6 <input type="hidden" name="price" value="6"/></td>
    </tr>
    <tr>
        <td>b</td>
        <td class="sort">20 <input type="hidden" name="price" value="20"/></td>
    </tr>
    <tr>
        <td>b</td>
        <td class="sort">0 <input type="hidden" name="price" value="0"/></td>
    </tr>
</table>