我如何先为某个值排序,而不是另一个?

时间:2015-11-18 11:18:11

标签: javascript jquery sorting

这是我的code

<div id="fascia-filtri-etichette">
    <div data-title="m" data-preorder="order-2" class="item">m</div>    
    <div data-title="2013" data-preorder="order-3" class="item">2013</div>    
    <div data-title="2012" data-preorder="order-3" class="item">2012</div>
    <div data-preorder="order-4" id="fascia-filtri-etichette-cancella">DELETE</div>
    <div data-title="E" data-preorder="order-1" class="item">E</div>
    <div data-title="S" data-preorder="order-1" class="item">S</div>
    <div data-title="2014" data-preorder="order-3" class="item">2014</div>
</div>

<script>
    var items = $("#fascia-filtri-etichette" + ' > div');
    items.sort(function (a, b) {
        return a.getAttribute('data-title') > b.getAttribute('data-title') || a.getAttribute('data-preorder') > b.getAttribute('data-preorder');
    }).detach().appendTo($("#fascia-filtri-etichette"));    
</script>

我想首先为pre-order字段订购(升序)div,而不是(因此对于每个前一个块)订购标题。

结果应为:

E // order 1
S // order 1
m // order 2
2012 // order 3
2013 // order 3
2014 // order 3
DELETE // order 4

我哪里错了?

4 个答案:

答案 0 :(得分:3)

你的错误是

  1. 排序功能应为-1或0或1,而不是真/假
  2. 代码很混乱,无法轻易检查它是如何工作的。我没有得到你如何结合标题排序和预购,可能错误就在这里
  3. 它看起来应该是这样的

    items.sort(function (a, b) {
        var po = a.getAttribute('data-preorder').localeCompare(b.getAttribute('data-preorder'));
        if(po != 0) return po;
    
        return a.getAttribute('data-title').localeCompare( b.getAttribute('data-title'));
    });
    

    首先它应该去检查预订,然后才比较标题。这是工作示例http://jsfiddle.net/rczjm4ph/

答案 1 :(得分:1)

使用2种排序功能而不是1种。测试用例http://jsfiddle.net/a47xv32f/

var items = $("#fascia-filtri-etichette" + ' > div');
items.sort(function (a, b) {
    return a.getAttribute('data-title') > b.getAttribute('data-title');
}).sort(function (a, b) {
    return a.getAttribute('data-preorder') > b.getAttribute('data-preorder');
}).detach().appendTo($("#fascia-filtri-etichette"));    

答案 2 :(得分:1)

仍然可以使用单个sort()

完成
var items = $("#fascia-filtri-etichette" + ' > div');
items.sort(function (a, b) {
    var cmpOrder = a.getAttribute('data-preorder').localeCompare(b.getAttribute('data-preorder'));

    if (cmpOrder !== 0) return cmpOrder;

    return a.getAttribute('data-title').localeCompare(b.getAttribute('data-title'));
});    

答案 3 :(得分:0)

制作一个首先查看预订的比较函数,然后是预订相等的项目的标题:

items.sort(function (a, b) {
  var aPre = a.getAttribute('data-preorder');
  var bPre = b.getAttribute('data-preorder');
  if (aPre == bPre) {
    return a.getAttribute('data-title') > b.getAttribute('data-title') ? 1 : -1;
  } else {
    return aPre > bPre ? 1 : -1;
  }
}).detach().appendTo($("#fascia-filtri-etichette"));