0

我有一个星期五下午的时刻,我真的很难按照我的意愿对这些物品进行分类!

我有一个列表,将通过从两个下拉列表中进行选择来过滤。一个用于属性,另一个用于值。然后我想根据两个下拉列表对列表进行排序。

因此,例如,用户可能选择值为 30 的 attr4。然后我想按升序对列表进行排序,首先是匹配项,然后是不匹配项。即下面的这个列表:

<ul>
    <li data-attr1="10" data-attr2="20" data-attr3="30" data-attr4="40" data-attr5="50">Option 1</li>
    <li data-attr1="20" data-attr2="30" data-attr3="40" data-attr4="50" data-attr5="10">Option 2</li>
    <li data-attr1="30" data-attr2="40" data-attr3="50" data-attr4="10" data-attr5="20">Option 3</li>
    <li data-attr1="40" data-attr2="50" data-attr3="10" data-attr4="20" data-attr5="30">Option 4</li>
    <li data-attr1="50" data-attr2="10" data-attr3="20" data-attr4="30" data-attr5="40">Option 5</li>
</ul>

然后看起来像这样:

<ul>
    <li data-attr1="50" data-attr2="10" data-attr3="20" data-attr4="30" data-attr5="40">Option 5</li>
    <li data-attr1="10" data-attr2="20" data-attr3="30" data-attr4="40" data-attr5="50">Option 1</li>
    <li data-attr1="20" data-attr2="30" data-attr3="40" data-attr4="50" data-attr5="10">Option 2</li>
    <li data-attr1="40" data-attr2="50" data-attr3="10" data-attr4="20" data-attr5="30">Option 4</li>
    <li data-attr1="30" data-attr2="40" data-attr3="50" data-attr4="10" data-attr5="20">Option 3</li>
</ul>

我可以很容易地使用以下方法对整个列表进行排序:

$('ul li').tsort({ data: attribute, order: 'asc'});

但我无法将匹配的项目放在不匹配的项目前面。我尝试使用:

$('ul li').tsort({ data: test, order: 'asc', place: 'start' });

无济于事。谁能发现我做错了什么?任何帮助将不胜感激 - 周五愉快!谢谢!

达伦

4

2 回答 2

1
$('ul.suites li').each(function() {
    if($(this).data(attribute)==0) {
        resultsZilch.push($(this));
    } else if($(this).data(attribute)>=amount) {
        resultsMatch.push($(this));
    } else {
        resultsClose.push($(this));
    }
});

resultsMatch.sort(normalCompare);
resultsClose.sort(normalCompare).reverse();

var resultsTotal = resultsMatch.concat(resultsClose, resultsZilch);

$('ul li').remove();

$.each(resultsTotal, function(index, item) {
    $('ul').append(item);
});
于 2012-08-11T08:28:20.850 回答
0

有几种方法可以做到这一点。

最简单的方法是将列表拆分为两个列表,首先是与您的规范匹配的项目(因此排在第一位),其次是不符合规范的项目。根据需要对每个列表进行排序,然后加入它们以覆盖原始列表。

第二种方法更复杂,但会就地对列表进行排序,需要您编写自定义排序函数:

$('ul li').tsort('', { sortFunction:function(a,b) {
    var amt, bmt;

    amt = matchesSpec(a);
    bmt = matchesSpec(b);
    if (amt || bmt) {
        if (amt && bmt) {
          // Both match spec, so equal
          return 0;
        }
        // Only one matches spec; the one that matches is always less to go first
        return (amt ? -1 : 1);
    }

    // Neither matches spec, do normal comparison
    return normalCompare(a, b);
}});

如果组合框属性与列表项匹配,matchesSpec 将返回 true。如果项目在排序顺序中相等,则 normalCompare 将返回 0,如果 a 应该排在第一位,则返回 -1,如果 b 应该排在第一位,则返回 1。如果 TinySort 有一个可调用的默认函数,你也可以使用它。

于 2012-08-10T17:48:08.617 回答