• ベストアンサー

複数のフィードの読み込みが日付順にならない

google feed API を使用して、複数のフィードを読み込み、日付順にソートするページを制作しております。複数のフィードの読み込みは実装できたのですが、順番が日付順の部分とそうでない部分がまざって、法則性が不明な順番でソートされてしまいます。 フィードは、RSS1.0/RSS2.0/Atom などいろいろなブログサービスのものを読み込んでいるのですが、このあたりが原因ではないかと探っています。 種類の違うフィードを読み込むときの注意点などあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

A No1です。 google feed を知りませんので、コードだけではわからないのと、ざっと見ただけですが… ajaxでのフィードではないのでしょうか? 非同期の場合はinitializeの中での実行順が、callbackの処理順を保証しているとは思えませんが、そのあたりはOKでしょうか? ソートには関係ないと思いますのでそれは置いておいておくとして… >entryArray[entryNum].sortDate = ( date.getFullYear()*1000000 ) + >( (date.getMonth() + 1)*3600*32 ) + ( date.getDate()*3600 ) + ( date.getHours()*60 ) で、日付を数値に置換えているようですが(どういう根拠かよくわかりませんけれど) そのまま計算すると、例えば  2000/12/31 → 2001494000  2001/01/01 → 2001118800 となるので、順序が逆転していませんか? Dateも、そのまま数値化してしまえば比較可能なように思います。 var test = []; test[0] = + new Date("2001/1/2"); test[1] = + new Date("2001/1/1"); test[2] = + new Date("2000/12/30"); test[3] = + new Date("2000/12/31"); test.sort(); for(var i=0; i<test.length; i++) test[i] = new Date(test[i]); alert(test.join("\n"));

その他の回答 (1)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

読み込みはフィード毎に行なっているのではないかと思いますが、フィード毎にソートすることが出来ないというのであれば、ソートしている部部のロジックがおかしいと推測されます。(どのような方法で行なっているのか不明なのでわかりませんが) 全体をまとめてソートしたいのであれば、全部の読込みが終了してからソートするかあるいは、それまでに読み込んだものを含めてソートするような処理にしておかないと、ソートのタイミングがおかしいのかも知れません。 仮定が違っていましたら、内容が的外れになっている可能性が大なので、無視してください。

momo_monom
質問者

補足

ソートは全部で30個くらいで、基本的には日付順に並んでいるのですが、 決まった数個のフィードだけ、日付と関係なく、最前部と中間部に表示されてしまいます。。。 同様のスクリプトを使用して、別の複数フィードリストの読み込みページも作っているのですが、 そちらは、問題なく日付順にソートされます。 上記のことから、フィード側に問題があるのかなと思っていたのですが、 偶然エラーが起きていないだけで、スクリプトに問題があるのでしょうか? 参考までに以下がスクリプトを添付いたします。 google.load("feeds", "1"); var entryArray = new Array(); var entryNum = 0; function initialize() { feedAdd("***URL_A***","***ブログ名_A***", 2); feedAdd("***URL_B***","***ブログ名_B***", 1); } function feedAdd(rssUrl, rsstitle, boolNum) { var blogtitle = rsstitle; var feed = new google.feeds.Feed(rssUrl); feed.setNumEntries(1); feed.load(function(result) { if (!result.error) { for (var i = 0; i < result.feed.entries.length; i++) { entryArray[entryNum] = result.feed.entries[i]; var date = new Date(result.feed.entries[i].publishedDate); entryArray[entryNum].sortDate = ( date.getFullYear()*1000000 ) + ( (date.getMonth() + 1)*3600*32 ) + ( date.getDate()*3600 ) + ( date.getHours()*60 ) + date.getMinutes(); entryArray[entryNum].blogName = blogtitle; entryNum+=1; } } if(boolNum==1){ feedOutput("feed", 100); } }); } function feedOutput(feedId, listNum){ var useFeed = ""; var useDate = ""; var container = document.getElementById(feedId); entryArray = asort(entryArray, "sortDate"); if(listNum==100){ listNum = entryNum; } for (var i = 0; i < listNum; i++) { var entry = entryArray[i]; var eimg = ""; var imgCheck = entry.content.match(/(src="http:){1}[\S_-]+((\.jpg)|(\.JPG)|(\.gif)|(\.png))/); if(imgCheck){ eimg += '<img ' + imgCheck[0] + '" width="" >'; } else { eimg += '<img src="dammy.gif" width="" >'; } var date = new Date(entry.publishedDate); var y = date.getFullYear() ; var week = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat') ; var w = week[date.getDay()]; var m = date.getMonth() + 1; if (m < 10) {m = "0" + m;} var d = date.getDate(); if (d < 10) {d = "0" + d;} var h = date.getHours(); if (h < 10) {h = "0" + h;} var mn = date.getMinutes(); if (mn < 10) {mn = "0" + mn;} useDate = m + "月" + d + "日"; useFeed += '<li class=""><a href="' + entry.link + '" target="_blank"><span class=' + '"list_box"><span class=""><h4>' + entry.blogName + '</h4>' + eimg + '</span><h3>' + entry.title + '</h3><span class="">' + y + '.' + m + '.' + d + '.' + w + '</span></span></a></li>'; } container.innerHTML = useFeed; } function asort(myArray, key){ return myArray.sort ( function (b1, b2) { return b1[key] > b2[key] ? -1 : 1; } ); } google.setOnLoadCallback(initialize);

関連するQ&A