1

我有一个评论列表,每个评论都有一个投票计数(正面或负面)。我正在尝试提取前两条评论(基于最高净票数,而不是投票数),复制他们的 HTML,并将它们添加到标题为“热门想法”的新部分

我想复制整个评论中数量最多的两条评论

HTML(一个过度简化的版本)......每个评论都重复这个:

<div class="comment">
    <div class="thumbblock">
        <div class="ratingtext">
            <div>
                <span class="num-total" data-voteup="8" data-votedown="4">+4</span>
            </div><!-- END random div -->
        </div><!-- END ratingtext -->
    </div><!-- END thumbblock -->
    <p>comment text</p>
</div><!-- END comment -->

jQuery:

jQuery(document).ready(function($) {
    //number of top comments to show
    var showResults = 2;

    //loop through each total rating
    //only pull the top two (in this case)
    $('span.num-total').slice(0, showResults).each(function(index){

        //calculate the net vote total based on data-voteup and data-votedown
        var upVotes = $(this).data('voteup');
        var downVotes = $(this).data('votedown');
        var netVotes = upVotes - downVotes;

        //get the HTML for those comments
        var commentHTML = $(this).parents('.comment').html();

        //append that HTML to the top comment div
        $('div.top-comments').append('<div class="comment">' + commentHTML + '</div>');

    });
});

在此处查看实时副本:http: //jobelty.com/company/apple
jQuery 来自一个名为 top-comments.js 的文件

4

3 回答 3

1

您在排序之前将列表缩减,因此充其量您将获得恰好位于顶部的两条评论的文本。

一个版本,它抓取两个排名最高的评论的完整评论元素,并将它们复制到.top-comments

jQuery(document).ready(function ($) {
    //number of top comments to show
    var showResults = 2;

    var ordered = [];

    // grab all the comments
    var comments = $('.commentlist .comment');

    $.each(comments,

    function (i, v) {
        // for each comment
        var cmt = $(v);
        var nums = cmt.find('.num-total');
        var upVotes = nums.data('voteup');
        var downVotes = nums.data('votedown');
        var netVotes = upVotes - downVotes;

        var pos = ordered.length;

        // find the first place in the ordered list it fits
        for (var j = 0; j < ordered.length; ++j) {
            if (ordered[j].votes < netVotes) {
                pos = j;
                break;
            }
        }

        // save element and count for later
        var vote = {
            'votes': netVotes,
            'cmt': cmt
        };

        ordered[pos] = vote;
    });

    var n = Math.min(2, ordered.length);

    // grab the first (up to) 2 and append to .top-comments    
    for (var i = 0; i < n; ++i) {
        ordered[i].cmt.clone().appendTo($('.top-comments'));
    }
});
于 2013-05-01T01:43:45.990 回答
0

尝试

$(function(){
    var voteels = $('.comment .num-total');

    var array = voteels.get();
    array.sort(function(a1, a2){
        var v1 = ($(a1).data('voteup') || 0) - ($(a1).data('votedown') || 0);
        var v2 = ($(a2).data('voteup') || 0) - ($(a2).data('votedown') || 0);

        return v1 < v2;
    });
    $(array.slice(0, 2)).closest('.comment').clone().appendTo('#top')
})

演示:小提琴

于 2013-05-01T02:06:44.433 回答
0

据我所知,除了您确定前两条评论是什么的部分之外,一切正常。这是一种基于首先对评论元素进行排序的方法。代码未经测试:

jQuery(document).ready(function($) {
    //number of top comments to show
    var showResults = 2;

    var netVotes = function(domElm) {          
        var upVotes = domElm.data('voteup');
        var downVotes = domElm.data('votedown');
        return upVotes - downVotes;
    };

    var sortedComments = $('span.num-total').slice(0).sort(function(a,b) {
        return netVotes(a) - netVotes(b);
    });

    sortedComments.slice(0, showResults).each(function(index){
        var commentHTML = $(this).parents('.comment').html();
        $('div.top-comments').append('<div class="comment">' + commentHTML + '</div>');
    });
});
于 2013-05-01T01:44:08.943 回答