Tinysort按多个属性排序(超过1个)

时间:2011-09-25 14:44:10

标签: jquery jquery-plugins jquery-mobile

我正在尝试将tinysort用作我使用jquery mobile构建的移动应用程序的一部分。我的应用程序在用户位置附近找到了位置,我希望能够快速对结果进行排序,而无需花时间重新查询数据库。

所以,我想要做的是能够使用tinysort重新排序结果,如果用户在该区域中有一个喜欢的位置,然后是距离,另外我希望能够按属性排序“如果用户已经标记过他们去过一个地方。

这就是我想要做的: 按收藏排序:

$("ul#places>li").tsort('',({order:"desc",attr:"myfav"},{order:"asc",attr:"dist"}));

排序依据:

$("ul#places>li").tsort('',({order:"desc",attr:"beenthere"},{order:"asc",attr:"dist"}));

默认排序://这很简单,没问题:

$("ul#places>li").tsort('',{order:"desc",attr:"dist"});

使用默认列表顺序,如:

<ul id="places">
  <li myfav="0" beenthere="0" dist=".02">Hot Dog Stand</li>
  <li myfav="1" beenthere="0" dist=".08">Joe's Shack</li>
  <li myfav="0" beenthere="1" dist=".10">Frick frack</li>
  <li myfav="1" beenthere="1" dist=".15">Mama's</li>
</ul>

按fav排序应返回:

  1. Joe's Shack
  2. 妈妈的
  3. 热狗架
  4. Frick frack
  5. 排序依据应该返回:

    1. Frick frack
    2. 妈妈的
    3. 热狗架
    4. Joe's Shack
    5. 然后回到距离排序:

      1. 热狗架
      2. Joe's Shack
      3. Frick frack
      4. 妈妈的
      5. 我对上面的tsort的调用只是不使用多个属性选择器,我的语法错误或者您无法对多个条件进行排序。

        有关如何使用tsort或其他解决方案实现此目标的任何想法都表示赞赏!

2 个答案:

答案 0 :(得分:6)

我明白Mottie的解决方案有效,但看起来有点复杂......两次打电话给tsort是有用的:

listOfItems.tsort({data:sorter, order:direction})
            .tsort({data: sorterAlt, order:direction})

在你的情况下,它是(如果''只是引用所选项目,你可以删除它们):

$("ul#places>li").tsort({order:"desc",attr:"myfav"})
                  .tsort({order:"asc",attr:"dist"})
$("ul#places>li").tsort({order:"desc",attr:"beenthere"})
                  .tsort({order:"asc",attr:"dist"})

同样使用HTML5的data-attrname样式,正如Mottie建议的那样。您可以随时在tsort中使用data: attrname

希望它仍然可以帮助你或其他人!

答案 1 :(得分:0)

您上面的结果实际上按“asc”排序,而不是您所指示的“desc”。无论哪种方式,我都不认为TinySort内置了多个属性排序,所以下一个最好的方法就是组合你想要排序的属性。

由于距离是默认排序,我认为最好将它与其他属性的数值组合。例如,myfav属性设置为“1”表示它是真的(我假设这个,但它似乎是你的意图)。如果我把这个贴在距离的前面,它的值最终会高于零值的假值 - 这与你想要的排序方向相反,所以我将真值分配为“0”而不是“1”并且假值为“9”而不是“0”。我知道这听起来很混乱,但请查看:

按Fav排序:

Location         fav been dist  combined
1. Joe's Shack    1    0   .08    0.08
2. Mama's         1    1   .15    0.15
3. Hot Dog Stand  0    0   .02    9.02
4. Frick frack    0    1   .10    9.10

排序依据:

Location         fav been dist  combined
1. Frick frack    0    1   .10    0.10
2. Mama's         1    1   .15    0.15
3. Hot Dog Stand  0    0   .02    9.02
4. Joe's Shack    1    0   .08    9.08

我希望这说清楚......无论如何,这里是一个demo,在那里我进行了排序顺序切换,以及我使用的代码:

var list = $("ul#places>li"),
    sortit = function(el, att){
        $(el).toggleClass('desc');
        var combo,
            order = $(el).is('.desc') ? 'desc' : 'asc';
        // make combo attribute
        if (att !== 'dist') {
            list.each(function(){
                // attr value = 1 means true, so assign it as a zero
                // attr value = 0 means false, so assign it as a nine
                // these numbers + distance, makes sure the lower
                // values are sorted first
                combo = $(this).attr(att) === '1' ? '0' : '9';
                $(this).attr('combo', combo + $(this).attr('dist'));

            });
            att = 'combo';
        }
        list.tsort('',({order:order,attr:att}));
    };

// Sort by favorite:
$('button:contains(Fav)').click(function(){ sortit(this, 'myfav'); });

// Sort by favorite:
$('button:contains(Been)').click(function(){ sortit(this, 'beenthere'); });

// Sort by default
$('button:contains(Dist)').click(function(){sortit(this, 'dist'); });