【问题标题】:How to play the most recent song by date and time如何按日期和时间播放最新歌曲
【发布时间】:2015-02-22 19:24:55
【问题描述】:

我正在开发一个 WebApp 来播放我在工作时从 twitter 解析的音乐。目前我正在按从 SoundCloud 获得的歌曲 ID 存储歌曲。但我无法组织它播放最后一首播放的歌曲。我考虑将数据库中的密钥更改为日期的方式,但随后我必须检查歌曲是否已经存在,我认为这将更难做到。但我想弄清楚如何比较日期然后显示最近的歌曲。

我的数据如下所示:

"6655480" : {
      "Date" : "12/16/2014 2:58:39 am",
      "SongName" : "The Island (Steve Angello, An21 & Max Vangeli remix)",
      "Tweet" : "Pendulum/Steve Angello/An21/Vangeli - The Island playing on #BPM - @sxmElectro",
      "uri" : "https://api.soundcloud.com/tracks/6655480"
    }

我试过了:

$scope.Song.sort(function(a,b){
var c = new Date(a.Date);
var d = new Date(b.Date);
return c-d;
});

但它不起作用。任何帮助表示赞赏。

我得到这样的 $scope.Song:

var ref = new Firebase("https://app.firebaseio.com/SC");
var sync = $firebase(ref);
$scope.Song = sync.$asArray();

更新:

所以我试图通过这样做来解决这个问题:

    $scope.log = [];
    angular.forEach(values, function(value, key) {
      value.sort(function(a,b){
            var c = new Date(a.Date);
            var d = new Date(b.Date);
            return c-d;
      }
    }, log);

但现在没有任何效果。我的语法有什么问题?这是正确的方法吗?

【问题讨论】:

  • 您的结构比简化的sort 更复杂。 Song 长什么样子?
  • 更新了我的答案,如果需要我可以给你更多代码
  • 不管你是怎么得到它的,完整的结构是什么样的?你不能这样做 a.Date 需要类似于:a.6655480.Date 但 ID 密钥都会不同。没有那些 ID 对象就简单多了
  • 所以要访问日期我只需使用 ng-repeat 那么我可以使用 forEach 函数遍历数组并提取日期,然后比较日期并将对象推送到新的数组中吗?
  • 当然,这很简单

标签: javascript angularjs angularjs-scope


【解决方案1】:

简单的获取方式

如果您只需要获取最新的歌曲而不进行任何排序和过滤,您可以简单地循环对象并选择最新的歌曲:

var songs = {
  "6655480": {
    "Date": "12/16/2014 2:58:39 am",
    "SongName": "The Island (Steve Angello, An21 & Max Vangeli remix)",
    "Tweet": "Pendulum/Steve Angello/An21/Vangeli - The Island playing on #BPM - @sxmElectro",
    "uri": "https://api.soundcloud.com/tracks/6655480"
  },
  "234": {
    "Date": "12/13/2014 2:58:39 am",
    "SongName": "Some Older Song",
    "Tweet": "Pendulum/Steve Angello/An21/Vangeli - The Island playing on #BPM - @sxmElectro",
    "uri": "https://api.soundcloud.com/tracks/6655480"
  },
  "123": {
    "Date": "12/19/2014 2:58:39 am",
    "SongName": "Some Newer Song",
    "Tweet": "Pendulum/Steve Angello/An21/Vangeli - The Island playing on #BPM - @sxmElectro",
    "uri": "https://api.soundcloud.com/tracks/6655480"
  },
  "253252": {
    "Date": "12/24/2014 2:58:39 am",
    "SongName": "The Newest Song",
    "Tweet": "Pendulum/Steve Angello/An21/Vangeli - The Island playing on #BPM - @sxmElectro",
    "uri": "https://api.soundcloud.com/tracks/6655480"
  }
}

var newestDate = new Date(0); // Jan 01 1970 
var newestSong;
for (var i in songs) {
  if (new Date(songs[i].Date) > newestDate) {
    newestDate = new Date(songs[i].Date)
    newestSong = songs[i];
  }
}

alert('The newest song is: ' + newestSong.SongName);

ng-repeat 过滤方式

最简单的 Angular 方法是使用 ng-repeat 和带有反向参数的 orderBy 过滤器:

ng-repeat="song in Song | orderBy:'Date':true"

请看这里:https://docs.angularjs.org/api/ng/filter/orderBy

注意:由于 orderBy 过滤器仅适用于数组(而且您不能简单地对对象进行排序),因此我必须在两者之间添加一个自定义过滤器以将对象转换为数组(使用来自 https://stackoverflow.com/a/19387871/965907 的过滤器),所以我们有这个:

ng-repeat="song in Song | objToArrayCustomFilter | orderBy:'Date':true"

在这里查看它的实际效果(添加了一个简单的切换按钮来翻转反向标志):

angular.module('test', [])
  .filter('object2Array', function() {
    return function(input) {
      var out = [];
      for (var i in input) {
        out.push(input[i]);
      }
      return out;
    }
  })
  .controller('Ctrl', function($scope) {
    $scope.reverse = true;
    $scope.songs = {
      "6655480": {
        "Date": "12/16/2014 2:58:39 am",
        "SongName": "The Island (Steve Angello, An21 & Max Vangeli remix)",
        "Tweet": "Pendulum/Steve Angello/An21/Vangeli - The Island playing on #BPM - @sxmElectro",
        "uri": "https://api.soundcloud.com/tracks/6655480"
      },
      "234": {
        "Date": "12/13/2014 2:58:39 am",
        "SongName": "Some Older Song",
        "Tweet": "Pendulum/Steve Angello/An21/Vangeli - The Island playing on #BPM - @sxmElectro",
        "uri": "https://api.soundcloud.com/tracks/6655480"
      },
      "123": {
        "Date": "12/19/2014 2:58:39 am",
        "SongName": "Some Newer Song",
        "Tweet": "Pendulum/Steve Angello/An21/Vangeli - The Island playing on #BPM - @sxmElectro",
        "uri": "https://api.soundcloud.com/tracks/6655480"
      },
      "253252": {
        "Date": "12/24/2014 2:58:39 am",
        "SongName": "The Newest Song",
        "Tweet": "Pendulum/Steve Angello/An21/Vangeli - The Island playing on #BPM - @sxmElectro",
        "uri": "https://api.soundcloud.com/tracks/6655480"
      }
    }

  })
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="test" ng-controller="Ctrl">
  <p ng-repeat="song in songs | object2Array | orderBy:'Date':reverse"><strong>{{song.SongName}}</strong>: {{song.Date}}</p>
  <button ng-click="reverse = !reverse">Toggle order</button>
</div>

在 Plunker 上:http://plnkr.co/edit/r8oDr5PtsPVZGO5WFaWR?p=preview

【讨论】:

  • ng-repeat 不是我正在寻找的解决方案,但我正在跟踪您的意思。我目前通过执行
  • Song Name: {{s 来按日期顺序显示我的歌曲.SongName}}
  • 我喜欢你的其他解决方案我现在正在测试它
  • 是的,如果你只需要获取最新的,不需要复杂的事情。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签