2012-08-10 35 views
0

我有一个星期五的下午时刻,我真的很努力,这些项目我多么想整理!jQuery的TinySort排序和数据放置属性

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

因此,例如,用户可以用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' }); 

无济于事。任何人都可以发现我做错了什么吗?任何帮助将不胜感激 - 有一个伟大的星期五!谢谢!

Darren

回答

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会如果ComboBox属性相匹配的列表项返回true。 normalCompare将返回0,如果该项目是在排序顺序相同,-1如果应该先和1。如果B应该是第一位的。如果TinySort有一个默认功能是可调用的,你也可以使用。

+0

我结束了不使用TinySort和去分裂的一个列表分为多个阵列,排序他们我想要的,然后替换列表项前连接起来将你的第一选择。谢谢! – iamdarrenhall 2012-08-11 08:28:17

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); 
});