重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

google feed API を使用して、複数のフィードを読み込み、日付順にソートするページを制作しております。複数のフィードの読み込みは実装できたのですが、順番が日付順の部分とそうでない部分がまざって、法則性が不明な順番でソートされてしまいます。

フィードは、RSS1.0/RSS2.0/Atom などいろいろなブログサービスのものを読み込んでいるのですが、このあたりが原因ではないかと探っています。

種類の違うフィードを読み込むときの注意点などあるのでしょうか?

A 回答 (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"));
    • good
    • 0

読み込みはフィード毎に行なっているのではないかと思いますが、フィード毎にソートすることが出来ないというのであれば、ソートしている部部のロジックがおかしいと推測されます。

(どのような方法で行なっているのか不明なのでわかりませんが)

全体をまとめてソートしたいのであれば、全部の読込みが終了してからソートするかあるいは、それまでに読み込んだものを含めてソートするような処理にしておかないと、ソートのタイミングがおかしいのかも知れません。


仮定が違っていましたら、内容が的外れになっている可能性が大なので、無視してください。

この回答への補足

ソートは全部で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);

補足日時:2013/02/18 18:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!