0

私は次のような数十のDIVのリストを持っています

<div data-sort="7.5"></div>
<div data-sort="3.2"></div>
<div data-sort="2.15"></div>
<div data-sort="-1.78"></div>
<div data-sort="-2.39"></div>

などなど、ajaxリクエストで新しいDIVを取得します。新しいDIVを挿入して、「data-sort」の順序が降順のままになるようにする必要があります。

4

5 に答える 5

4

この挿入(O(logN))を実行するための最速のアルゴリズムは、新しいアイテムが間に入る値のバイナリ検索を実行することです。リストがすでに最初にソートされていると仮定します(自動的にソートされていない場合は、ここで他の回答の1つを使用してください)。

/**+
 * Boilerplate to check first/last value
 */
var sortval = $new.data('sort');
var $first = $("div:first");
if (sortval >= $first.data('sort')) {
   $new.insertBefore($first);
    return;
}

var $last = $("div:last");
if (sortval <= $last.data('sort')) {
   $new.insertAfter($last);
    return;
}
/*-*/

//Fun stuff
var count = 0;
var $div = $("div");
do {
   var index = parseInt($div.length / 2)
   var $compare = $div.eq(index);
   var compare = $compare.data('sort');
   if (sortval === compare) {
      break;
   }
   else if (sortval < compare) {
      $div = $div.slice(index, $div.length);
   }
   else {
      $div = $div.slice(0, index);
   }
}
while ($div.length > 1);

if (sortval === compare || sortval > compare) { $new.insertBefore($compare); }
else { $new.insertAfter($compare); }

http://jsfiddle.net/ExplosionPIlls/SdjAy/1/

于 2013-01-24T14:49:47.110 に答える
2

可能な限り最適ではありませんが、ajaxリクエストが完了するたびにdivを並べ替えるだけです。

$("div").sort(function (prev, next) {
    return parseInt(next.dataset.sort) - parseInt(prev.dataset.sort);
}).appendTo("body");

それが長すぎる場合は、(?を介して)divを循環し、小さい方.eachの最初のdivを見つける必要があります。data-sort

于 2013-01-24T06:53:19.800 に答える
1

エレガントではないかもしれませんが、十分に速いです...

ハンドラーsuccess内:

...
success: function(data) {
    $(data).each(function(){
        var $adiv = $(this);
        var sortval = parseFloat($adiv.data("sort"));
        var last = true;
        $("div").each(function(){
            if ($(this).data("sort") < sortval) {
                $(this).prepend($adiv);
                last = false;
                return false;
            }
        });
        if(last) {
            $("div").last().append($adiv);
        }
    });
}

jsFiddle

于 2013-01-24T07:40:57.667 に答える
0

カスタムロジックを使用することもできます。ぜひお試しください。

これがあなたのHTMLです

<div id="dvBase">
        <div data-sort="7.5">
        </div>
        <div data-sort="3.2">
        </div>
        <div data-sort="2.15">
        </div>
        <div data-sort="-1.78">
        </div>
        <div data-sort="-2.39">
        </div>
    </div>
    <div id="tempDiv">
    </div>

javascriptコード

var divToAdd = "<div data-sort=\"1.5\"></div>";
        function getValue() {

            $("#tempDiv").html(divToAdd);
            var returnvalue = $("#tempDiv div").attr("data-sort");
            $("#tempDiv").empty();
            return returnvalue;
        }
        $(document).ready(function () {
            var valueToadd = parseFloat(getValue());
            var count = $("#dvBase >div[data-sort]").length;

            $("#dvBase >div[data-sort]").each(function (index, obj) {
                var value1 = parseFloat($(obj).attr("data-sort"));
                if (index < count - 1) {
                    var value2 = parseFloat($(obj).next().attr("data-sort"));

                    if ((value1 == valueToadd || (valueToadd < value1 && valueToadd >= value2)) && $("#dvBase >div[data-sort]").length === count) {
                        $(obj).after(divToAdd);
                    }
                } else {
                    if ($("#dvBase >div[data-sort]").length === count) {
                        $(obj).after(divToAdd);
                    }
                }
            });
        });
于 2013-01-24T07:35:01.853 に答える
0

私はここの答えの助けを借りてこのようにそれを解決しました:

$("div").each(function(i){
    if(parseFloat($(this).data("weight"))<=weight){
        $(newDiv).insertBefore(this);
        return false;
    }
    else if (i == $(".post").length - 1) {
        $(newDiv).insertAfter(this);
        return false;
    }
});

これは問題なく動作し、十分に高速であるようです...誰かがそれに欠陥を見ますか?

于 2013-01-24T17:31:49.930 に答える