首页 > 解决方案 > 如何通过 .isoDate 对 RSS 提要进行排序并保持提要的内容连接(标题和链接)?

问题描述

我想按最近的项目对 RSS 提要进行排序,并保持项目的标题与其相应的链接匹配。这是我解析和显示提要的方式。我认为最好的属性是 .isoDate,但我不确定如何进行此过程。

我只需将 item.isoDate + item.title 推入一个数组并对其进行排序,然后对 item.isoDate + item.link 的数组执行相同的操作,就可以让它工作。然而,这是一种快速的解决方法,并不总是适用于较大的提要。

function MarinersFeed() {
      const [disable, setDisable] = React.useState(false);

      


      const [completeFeed, setCompletedFeed] = React.useState([]);
      const [feedTitle, setFeedTitle] = React.useState([]);
      const [feedLink, setFeedLink] = React.useState([]);

      

      React.useEffect(async () => {
            
            let Parser = require('rss-parser');
            let parser = new Parser();

            const tFeed = [];
            const tFeedTitle = [];
            const tFeedLink = []
            
         
            let feed = await parser.parseURL('https:*******.herokuapp.com/https://www.mlb.com/mariners/feeds/news/rss.xml');
            feed.items.forEach(item => {

                  //sort by using item.isoDate, keep item.title and item.link connected
                  

                  tFeed.push(item.title);
                  
                  tFeedLink.push( item.link);
                  
                  
                 
                 

            });

            setCompletedFeed(tFeed);
            //setFeedTitle(tFeedTitle);
            setFeedLink(tFeedLink);


      }, []);

           
      const renderData = () => {
            return completeFeed.map((f, index) => {

                  const title = feedTitle[index];
                  const link = feedLink[index]
                  const fullFeed = completeFeed[index]

                  return <div key={index} >


                        <h3>{fullFeed}
                              <Button onClick={(e) => {
                                    e.preventDefault();
                                    console.log(link)
                                    window.open(link, "_blank")
                              }}></Button></h3>


                  </div>
            })
      }

      




           
            
            return(
                  <>
                        
                        {renderData()}
                  </>
            )
            
      }

export default MarinersFeed;

标签: javascriptnode.jsreactjsrssrss-reader

解决方案


您可以使用数组排序方法,例如

const RssParser = require('rss-parser');

async function fetchRss({ url, sort = false, sortOrder = 'desc' } = {}) {
  const rssParser = new RssParser();
  const feed = await rssParser.parseURL(url);

  if (sort) {
    feed.items.sort((a, b) => {
      return sortOrder === 'asc'
        ? new Date(a.isoDate) - new Date(b.isoDate) // Oldest first
        : new Date(b.isoDate) - new Date(a.isoDate); // Newest first
    });
  }

  return feed;
}

async function main() {
  const output = await fetchRss({ url: 'https://www.mlb.com/mariners/feeds/news/rss.xml', sort: true });
  console.log(output);
}

main();

输出:

{ 
  items: [
    { 
      creator: 'Jim Callis, Sam Dykstra and Jonathan Mayo',
      title: '30 AFL sleeper prospects -- 1 for each org.',
      link: 'https://www.mlb.com/mariners/news/sleeper-prospects-in-arizona-fall-league-2021',
      pubDate: 'Fri, 15 Oct 2021 01:46:57 GMT',
      'dc:creator': 'Jim Callis, Sam Dykstra and Jonathan Mayo',
      guid: 'https://www.mlb.com/mariners/news/sleeper-prospects-in-arizona-fall-league-2021',
      isoDate: '2021-10-15T01:46:57.000Z'
    },
    { 
      creator: 'Daniel Kramer',
      title: 'J-Rod launches his own YouTube channel',
      link: 'https://www.mlb.com/mariners/news/julio-rodriguez-mariners-top-prospect-launching-youtube-channel',
      pubDate: 'Thu, 14 Oct 2021 14:31:30 GMT',
      'dc:creator': 'Daniel Kramer',
      guid: 'https://www.mlb.com/mariners/news/julio-rodriguez-mariners-top-prospect-launching-youtube-channel',
      isoDate: '2021-10-14T14:31:30.000Z'
    },
...

推荐阅读