【问题标题】:Sorting news items by their associated date - Javascript按相关日期对新闻项目进行排序 - Javascript
【发布时间】:2014-05-12 13:18:58
【问题描述】:

我一直在尝试解决这个问题,但没有成功。我有 2 个数组:

var dates = [
    new Date(2014, 4, 11, 10, 10, 0).getTime(),
    new Date(2012, 4, 10, 8, 20, 0).getTime(),
    new Date(2013, 4, 9, 7, 20, 0).getTime(),
    new Date(2010, 4, 7, 12, 59, 0).getTime()
            ];

var newsItems = ["NewsItem1","NewsItem2","NewsItem3","NewsItem4"];

我正在使用函数var desc = dates.sort(function(a,b){return b-a}); 然而,为了对日期数组进行排序,我无法弄清楚如何重新排列 newsItems 数组以使其与日期数组对齐。我试过了,但它似乎不起作用:

var datesDuplicate = [
    new Date(2014, 4, 11, 10, 10, 0).getTime(),
    new Date(2012, 4, 10, 8, 20, 0).getTime(),
    new Date(2013, 4, 9, 7, 20, 0).getTime(),
    new Date(2010, 4, 7, 12, 59, 0).getTime()
            ];
for(var i = 0; i < arrayLength; i++){
    for(var j = 0; j < arrayLength; j++){
        if(dates[i] == datesDuplicate[j]){
            document.getElementById(getElement(i)).innerHTML = newsItems[j];
            break;
        }
    }

}

非常感谢任何帮助。

【问题讨论】:

  • newsItems 元素的顺序是否直接对应于当前的 Date 对象?一个简单的解决方法是将一对 newsItems 与日期放在一个列表中?例如,[[date1,newsItem1],[date2,newsItem2]....]
  • 是的,newsItems 中元素的顺序对应于它们的日期顺序,因此,它们确实相互对应,但是,您能否澄清一下“配对”,因为我不熟悉它。
  • [..., date: new Date(2012, 4, 10, 8, 20, 0).getTime(), item: 'NewsItem2'}, ...]

标签: javascript arrays sorting date


【解决方案1】:

如果您希望新闻项目和日期相互关联,它们应该是同一对象的一部分。

 var items = [
   { date: new Date(2014, 4, 11, 10, 10, 0).getTime(), label: "NewsItem1" },
   { date: new Date(2012, 4, 10, 8, 20, 0).getTime(), label: "NewsItem2" },
   etc...
 ];

然后你可以像这样排序

 var desc = items.sort(function(a,b){return b.date-a.date});

【讨论】:

    【解决方案2】:

    试试这样的

    var news = [
       {date: new Date(2014, 4, 11, 10, 10, 0).getTime(), item: "NewsItem1" },
       {date: new Date(2012, 4, 10, 8, 20, 0).getTime(), item: "..." },
       {date: new Date(2013, 4, 9, 7, 20, 0).getTime(), item: "..." },
       {...}
    ];
    

    您还需要调整排序功能。如果您必须从两个数组转换,请尝试使用zip 将它们组合到上述结构中。

    【讨论】:

      【解决方案3】:

      您的抽象可以通过将日期与 newsItems 配对来改进:

      var datePairs = 
      [
        ["NewsItem1", new Date(2014, 4, 11, 10, 10, 0).getTime()],
        ["NewsItem2", new Date(2012, 4, 10, 8, 20, 0).getTime()],
        ["NewsItem3", new Date(2013, 4, 9, 7, 20, 0).getTime()],
      ];
      
      var desc = datePairs.sort(function(a,b){return b[1]-a[1]}); //sort by date (the second element of each element)
      

      【讨论】:

        【解决方案4】:

        如果您无法控制数据的结构并且被 2 个数组(密集且长度相同)卡住,那么您可以使用 ECMA5 方法对它们进行排序。

        Javascript

        var dates = [
                new Date(2014, 4, 11, 10, 10, 0).getTime(),
                new Date(2012, 4, 10, 8, 20, 0).getTime(),
                new Date(2013, 4, 9, 7, 20, 0).getTime(),
                new Date(2010, 4, 7, 12, 59, 0).getTime()
            ],
            newsItems = ["NewsItem1", "NewsItem2", "NewsItem3", "NewsItem4"];
        
        dates.map((function (date, index) {
            return {
                date: date,
                item: this[index]
            };
        }), newsItems).sort(function (a, b) {
            return b.date - a.date;
        }).forEach(function (record, index) {
            dates[index] = record.date;
            newsItems[index] = record.item
        });
        
        console.log(dates, newsItems);
        

        输出

        [1399795800000, 1368076800000, 1336630800000, 1273229940000] ["NewsItem1", "NewsItem3", "NewsItem2", "NewsItem4"] 
        

        开启jsFiddle

        【讨论】:

          猜你喜欢
          • 2012-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-27
          • 2023-03-14
          • 1970-01-01
          相关资源
          最近更新 更多