0

上位ユーザーのリストとその返信数を表示しようとしていますが、2 つの問題があります。

  1. ユーザーに対して誤った数の返信を表示している (何らかの理由で倍増している)、および
  2. トップユーザーのリストにユーザーが複数回表示されることがあります

次のように、すべての一意のユーザーと正しい返信数のリストが必要です。

  • ジェーン ドウ 8
  • ジャック・スミス 7
  • アンドレア・ジョンソン 5
  • フレッド・ジャクソン 4
  • 等。

編集が必要な部分は次のとおりだと思います。

    {
        var htmlToAdd = '';
        people.sort(compareTotals);

    people.remove(0);

        var peopleLimit = people.length;
        if (peopleLimit > 10)
            peopleLimit = 10;
        for (var i = 0; i < peopleLimit; i++)
        {
            htmlToAdd = htmlToAdd + '<div class="peopleLink"><a href="' + people[i][2] + '">' + people[i][3] + '</a> has posted ' + people[i][0] + ' replies.</div>';
        }
        jQuery('#peopleList').html(htmlToAdd);
    }

何を変更する必要があるかについてのアイデアはありますか?

これが役立つ場合、完全なコードは次のとおりです。

     if (jQuery("div.community_topic_box").size() > 0)  // Only true for the front page
    {
        jQuery("#postersFrame").insertAfter(".community_stats");
    }
    else
    {
        jQuery("#postersFrame").hide();
    }
});

var people = new Array();
var peopleFinished = 0;
var repliesHandled = 0;
var count = 0;

// Generic JSON functions
function JSONscriptRequest(fullUrl) {
    this.fullUrl = fullUrl; 
    this.headLoc = document.getElementsByTagName("head").item(0);
    this.scriptId = 'YJscriptId' + JSONscriptRequest.scriptCounter++;
}
JSONscriptRequest.scriptCounter = 1;
JSONscriptRequest.prototype.buildScriptTag = function () {
    this.scriptObj = document.createElement("script");
    this.scriptObj.setAttribute("type", "text/javascript");
    this.scriptObj.setAttribute("src", this.fullUrl);
    this.scriptObj.setAttribute("id", this.scriptId);
}
JSONscriptRequest.prototype.removeScriptTag = function () {
    this.headLoc.removeChild(this.scriptObj);  
}
JSONscriptRequest.prototype.addScriptTag = function () {
    this.headLoc.appendChild(this.scriptObj);
}

function handlerTopics(results) {      
    var obj;
    if ( results.total > 0)
    {
        count = results.total / 30;
        var htmlToAdd = '';
        if (results.total > 30)
        {
          var iterations = results.total / 30;
      for (var j=0; j < iterations; j++)
      {
        obj=new JSONscriptRequest('https://api.getsatisfaction.com/companies/' + companyName + '/topics.json?sort=recently_active&active_since=' + timeStamp + '&limit=30&page=' + j +'&callback=handlerEachTopics');     
        obj.buildScriptTag(); // Build the script tag     
        obj.addScriptTag(); // Execute (add) the script tag
      }
        }
    else{
       obj=new JSONscriptRequest('https://api.getsatisfaction.com/companies/' + companyName + '/topics.json?sort=recently_active&limit=30&active_since=' + timeStamp + '&callback=handlerEachTopics');     
           obj.buildScriptTag(); // Build the script tag     
       obj.addScriptTag(); // Execute (add) the script tag
    }
    }
    jQuery('#peopleList').html('Loading member details...')
}

function handlerEachTopics(results) {  
    if ( results.data.length > 0)
    {
      for(var i=0; i<results.data.length; i++)
      {
    if (results.data[i].active_replies > 0)
    {
       obj=new JSONscriptRequest( results.data[i].url + '/replies.json?callback=handlerEachTopicReplies');     
           obj.buildScriptTag(); // Build the script tag     
       obj.addScriptTag(); // Execute (add) the script tag
       repliesHandled++;
    }
      }
    }
    peopleFinished++;
}

function handlerEachTopicReplies(results) {      
    if ( results.data.length > 0)
    {
      for(var i=0; i<results.data.length; i++)
      {
        if ((!results.data[i].author.employee) &&(!isInArrayYet(results.data[i].author.canonical_name) > 0))
        {
            people[people.length] = [1, results.data[i].author.canonical_name, results.data[i].author.at_sfn, results.data[i].author.name];
        }
      }
    }
    repliesHandled--;    
    if ((peopleFinished >= count - 1) && (repliesHandled <= 0 ))
    {
        var htmlToAdd = '';
        people.sort(compareTotals);

    people.remove(0);

        var peopleLimit = people.length;
        if (peopleLimit > 10)
            peopleLimit = 10;
        for (var i = 0; i < peopleLimit; i++)
        {
            htmlToAdd = htmlToAdd + '<div class="peopleLink"><a href="' + people[i][2] + '">' + people[i][3] + '</a> has posted ' + people[i][0] + ' replies.</div>';
        }
        jQuery('#peopleList').html(htmlToAdd);
    }
}

function isInArrayYet(name)
{
  for(var i=0; i< people.length; i++)
  {
    if (people[i][1] == name)
    {
      people[i][0]++;
      return true;
    }
  }
  return false;
}

function compareTotals(a, b) {
    return b[0] - a[0];
}

Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

  </script>

ユーザーのリスト内の各アイテムとその返信が 1 回だけ表示されるようにするにはどうすればよいですか? また、返信の数が増えないようにするにはどうすればよいですか? ご協力ありがとうございました。

4

1 に答える 1

0

投稿数に問題がある場合は、

htmlToAdd + '<div class="peopleLink"><a href="' + people[i][2] + '">' + people[i][3] + '</a> has posted ' + people[i][0] + ' replies.</div>';

そして、それが正しいことを確認してください。people配列とその配列内のデータを再確認することをお勧めし ます。

コードの他の部分は私にとっては問題ありません。完全なコードを投稿できれば、私はあなたを助けることができるでしょう.

于 2013-01-08T01:30:56.250 に答える