2

この非常に便利なプラグインを使用して要素を並べ替えています。ただし、要素を数値で比較すると、99、98、9、83、8、78などの誤った結果が生成されます。

これはプラグインの問題ですか、それとも私がそれを実装した方法の問題ですか?

コード:

<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script language="javascript">
jQuery.fn.sortElements = (function(){
    var sort = [].sort;
    return function(comparator, getSortable) {
        getSortable = getSortable || function(){return this;};
        var placements = this.map(function(){

            var sortElement = getSortable.call(this),
                parentNode = sortElement.parentNode,
                nextSibling = parentNode.insertBefore(
                    document.createTextNode(''),
                    sortElement.nextSibling
                );

            return function() {

                if (parentNode === this) {
                    throw new Error(
                        "You can't sort elements if any one is a descendant of another."
                    );
                }
                parentNode.insertBefore(this, nextSibling);
                parentNode.removeChild(nextSibling);
            };

        });
        return sort.call(this, comparator).each(function(i){
            placements[i].call(getSortable.call(this));
        });
    };
})();

$(document).ready(function(){

    $('.item').sortElements(function(a,b){
        return $(a).html() < $(b).html() ? 1 : -1;
    });

});
</script>
</head>
<body>

<% for i = 0 to 100 %>
<div class="item"><%=i*Rnd%></div>
<% next %>

</body>
</html>
4

2 に答える 2

3

parseInt 文字列の数値に基づいて並べ替えを行う場合は、 MDNdocsメソッドを使用して文字列を数値に変換します

$('.item').sortElements(function(a,b){
        return parseInt($(a).html(),10) < parseInt($(b).html(),10) ? 1 : -1;
    });

または、Gauravがコメントで述べたように、浮動小数点数のparseFloat MDNドキュメント。 )

于 2012-06-13T21:38:54.020 に答える
0

文字列を比較しています。Javascript"88" < "9"では、しかし(明らかに)88 > 9、または(+"88" > +"9")。比較関数で文字列を数値に変換する必要があります。

return +$(a).html() < +$(b).html() ? 1 : -1;
于 2012-06-13T21:38:27.763 に答える