如何按数据属性的数值对元素进行排序?

IT技术 javascript html jquery
2021-02-05 17:29:29

我有多个带有属性的元素:data-percentage,有没有办法先使用 JavaScript 或 jQuery 按最低值将元素按升序排序?

HTML:

<div class="testWrapper">
  <div class="test" data-percentage="30">
  <div class="test" data-percentage="62">
  <div class="test" data-percentage="11">
  <div class="test" data-percentage="43">
</div>

想要的结果:

<div class="testWrapper">
  <div class="test" data-percentage="11">
  <div class="test" data-percentage="30">
  <div class="test" data-percentage="43">
  <div class="test" data-percentage="62">
</div>
5个回答

使用Array.sort

var $wrapper = $('.testWrapper');

$wrapper.find('.test').sort(function(a, b) {
    return +a.dataset.percentage - +b.dataset.percentage;
})
.appendTo($wrapper);

这是小提琴:http : //jsfiddle.net/UdvDD/


如果您使用的是 IE < 10,则不能使用该dataset属性。使用getAttribute来代替:

var $wrapper = $('.testWrapper');

$wrapper.find('.test').sort(function(a, b) {
    return +a.getAttribute('data-percentage') - +b.getAttribute('data-percentage');
})
.appendTo($wrapper);

这是小提琴:http : //jsfiddle.net/UdvDD/1/

@LukeOliff - 有时。在这种情况下不需要它,所以我不想要它的开销。
2021-03-15 17:29:29
@JosephSilber 干得好,干得漂亮!我有一个问题,如果 div 没有“数据百分比”,我想排在最后一位,这可能吗?谢谢。
2021-03-28 17:29:29
jQuery.data 是你的朋友
2021-03-31 17:29:29
@FelixKling - 我讨厌隐式转换。如果我在做数学,我喜欢直接处理数字。
2021-04-06 17:29:29
你并不需要一元加号这里,因为-将两个操作数转换为数字。不过,它使事情变得更加清晰。
2021-04-13 17:29:29
$('.testWrapper').find('.test').sort(function (a, b) {
   return $(a).attr('data-percentage') - $(b).attr('data-percentage');
})
.appendTo('.testWrapper');
吉尔伯 我有一个问题,如果 div 没有“数据百分比”,我想排在最后一位,这可能吗?谢谢。
2021-04-11 17:29:29

出于某种原因,在 Firefox 64.0.2 上,没有一个答案对我有用。这就是最终奏效的方法,Joseph Silber 和 Jeaf Gilbert 的答案的混合:

var $wrapper = $('.testWrapper');

$wrapper.find('.test').sort(function(a, b) {
    return +$(a).data('percentage') - +$(b).data('percentage');
})
.appendTo($wrapper);
解释是,如果您像我一样设置数据值,.data('percentage',5)那么stackoverflow.com/questions/23538335/...它是在内部设置的,因此 dataset.percentage 或 .getAttribute('data-percentage') 都不起作用
2021-03-26 17:29:29

我认为 Tinysort Jquery 插件应该是一个选项,你可以在这里得到它:http ://tinysort.sjeiti.com/

我没有试过,但代码应该是这样的:

$("#test > div").tsort("",{attr:"data-percentage"});

希望这会有所帮助

不需要第一个空字符串参数。只需将对象作为其唯一参数传递给它。
2021-04-01 17:29:29

更强大的选项,此功能可以让您根据多个选项对元素进行排序。

https://jsfiddle.net/L3rv3y7a/1/

// This calls the function
DOYPSort('#wrapper', '.element', value, order);

    // Parameters must be strings
    // Order of must be either 'H' (Highest) or 'L' (Lowest)
    function DOYPSort(wrapper, elementtosort, AttrToSort, orderof) {
        $(wrapper).find(elementtosort).sort(function (a, b) {
            if (orderof === 'H') {
                return +b.getAttribute(AttrToSort) - +a.getAttribute(AttrToSort);
            } 
            if (orderof === 'L') {
                return +a.getAttribute(AttrToSort) - +b.getAttribute(AttrToSort);
            }
        }).appendTo(wrapper);
    }