在javascript/angular中创建播放列表(按值复制数组,但按引用设置嵌套对象)

Creating a playlist in javascript/angular (copying array by value but setting nested objects by reference)

本文关键字:引用 设置 嵌套 对象 复制数组 angular 创建 播放列表 javascript      更新时间:2023-09-26

我正在尝试在一个角度应用程序中为音乐播放器创建一个播放列表,其中包括一个随机播放按钮。现在我对实际的随机播放功能没有问题,我正在使用费舍尔耶茨随机播放并且它工作正常。单击随机播放按钮时,我调用随机播放函数:

$scope.shuffle = function(){
    $scope.shufflePlaylist = angular.copy($scope.playlist);
    //// Then shuffle the array
    var i = $scope.shufflePlaylist.length, t, m;
    for(var i = $scope.shufflePlaylist.length - 1; i > 0; i--){
      m = Math.floor(Math.random() * i);
      t = $scope.shufflePlaylist[m];
      $scope.shufflePlaylist[m] = $scope.shufflePlaylist[i];
      $scope.shufflePlaylist[i] = t;
    }
  }

我创建了一个包含随机播放列表的新数组,因为我仍然需要原始播放列表,以便我可以取消随机播放。设置随机播放的播放列表时,我必须使用angular.copy,否则原始播放列表也会被随机播放(因为随机播放只是对原始播放列表的引用)。

这就是我的问题所在,因为我正在按值复制我的数组,并且它不再以任何方式连接到原始数组,我对一个列表中的轨道(例如喜欢/不喜欢)所做的任何操作都不会发生在另一个列表中。所以我希望 2 个播放列表不通过引用连接,但每个数组中的各个对象应该通过引用连接。这可能吗?

这是一个 plunkr:http://plnkr.co/edit/a0wpSwatnDlNSBanK7HP?p=preview

angular.copy 将创建深度复制 https://docs.angularjs.org/api/ng/function/angular.copy

尝试使用数组切片复制数组:

$scope.shufflePlaylist = $scope.playlist.slice()