0

金曜日の午後のひと時を過ごしているのですが、これらのアイテムを思い通りに並べ替えるのに本当に苦労しています!

2 つのドロップダウン リストから選択してフィルタリングするリストがあります。1 つは属性用で、もう 1 つは値用です。次に、2 つのドロップダウン リストに基づいてリストを並べ替えます。

したがって、たとえば、ユーザーは値が 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

これを行うにはいくつかの方法があります。

最も簡単な方法は、リストを 2 つのリストに分割することです。1 つ目は仕様に一致する (したがって最初に移動する) 項目で、2 つ目はそうでない項目です。各リストを好きなように並べ替えてから、それらを結合して元のリストを上書きします。

より複雑ですが、リストをその場でソートする 2 つ目の方法では、カスタムのソート関数を記述する必要があります。

$('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 に答える