2014-12-04 71 views
0

我写了一个函数,它应该按照价格高 - >低排序data-cost数据属性。当data-cost都具有相同数量的数字时,它工作正常,但如果我添加具有不同数量的数字的data-cost,则该功能不再有效。我想保持现在的结构,但由于我对JS还比较陌生,因此我开放给更多可重用的解决方案。预先感谢您的帮助。排序数据属性

小提琴:

http://jsfiddle.net/dn6mja0t/

HTML:

<a id="sort" href="#">Price High to Low</a> 

<ul class="returned-list"> 
    <li data-cost="101">101</li> 
    <li data-cost="103">103</li> 
    <li data-cost="106">106</li> 
    <li data-cost="42">42</li> 
</ul> 

JS:

var sortHL = function() { 
    function compare(a,b) { 
     if (a.cost > b.cost) 
      return -1; 
     if (a.cost < b.cost) 
      return 1; 
     return 0; 
    } 

    var items = []; 
    $('.returned-list li').each(function() { 
     var item = { 
      cost: $(this).attr('data-cost'), 
      contents: $(this)[0].outerHTML 
     }; 
     items.push(item); 
    }); 

    items.sort(compare); 
    $('.returned-list').html(''); 
    for(var i=0;i<items.length;i++) { 
     $('.returned-list').append(items[i].contents); 
    } 
}; 

$('#sort').on('click', function() { 
    sortHL(); 
}); 

回答

1

执行强制类型转换:

cost: Number($(this).attr('data-cost')), 
+0

我觉得傻不是想这个。像魅力一样工作,谢谢! – Dann 2014-12-04 20:16:48

+0

@Dann欢迎您。 – Verhaeren 2014-12-04 21:47:23

3

你将要使用

cost: parseInt($(this).attr('data-cost'), 10) 

在你的对象构造,这样就比较成本数字并不为字符串。

2

这里是一个简短的形式:

var sortHL = function() { 
    $(".returned-list li[data-cost]").detach().sort(function(a,b){ 
     return Number($(a).attr('data-cost')) < Number($(b).attr('data-cost')) 
    }).appendTo($(".returned-list")) 
}; 

$('#sort').on('click', function() { 
    sortHL(); 
});