javascript - 如何洗牌除了固定位置的数组

标签 javascript

有一个由轨道和歌曲组成的播放列表:

var arr = [         
    {'title': 'jingle fixed'},
    {'title': track 0},
    {'title': track 1},
    {'title': 'jingle fixed'},
    {'title': track 2},
    {'title': 'jingle fixed'},
    {'title': track 3},
    {'title': track 4},
    {'title': track 5}
];

function shuffle(playList) {
    let currentIndex = playList.length, randomIndex;
    
    while (currentIndex != 0) { 
        randomIndex = Math.floor(Math.random() * currentIndex);
        currentIndex--;

        // How to except by playList.title?
        [playList[currentIndex], playList[randomIndex]] = [playList[randomIndex], playList[currentIndex]];
    }
  
    return playList;
}

我只需要随机化(随机播放)轨道,并将歌曲留在原位。

预期的结果:

[           
    {'title': 'jingle fixed'},
    {'title': track 4},
    {'title': track 1},
    {'title': 'jingle fixed'},
    {'title': track 5},
    {'title': 'jingle fixed'},
    {'title': track 3},
    {'title': track 0},
    {'title': track 1}
];

最佳答案

我确信有人可以找到更漂亮的解决方案,因为我认为这具有相当高的算法复杂性(复制一个数组,对其进行过滤,对其进行排序并重新创建一个映射第一个数组的数组......),但它有效。

const tracks = [{
    title: 'jingle fixed'
  },
  {
    title: "track 4"
  },
  {
    title: "track 1"
  },
  {
    title: 'jingle fixed'
  },
  {
    title: "track 5"
  },
  {
    title: 'jingle fixed'
  },
  {
    title: " track 3"
  },
  {
    title: "track 0"
  },
  {
    title: "track 1"
  }
];

const shuff_tracks = tracks.filter(t => t.title !== "jingle fixed");
shuff_tracks.sort(() => Math.floor(Math.random() * 10) % 2 === 0 ? 1 : -1);

let tr_i = -1;

const out = tracks.map(t => {
  if (t.title === "jingle fixed") return t;
  return shuff_tracks[++tr_i];
});

console.log(out)

关于javascript - 如何洗牌除了固定位置的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74317298/

相关文章:

Javascript 正则表达式不工作

javascript - 使用 console.log 作为 promise 回调

php - Javascript 闭包与 PHP 闭包,有什么区别?

javascript - 如何让我的脚本从 30 个随机 div 中生成 12 个 - Jquery

javascript - 我的静态网站中的 Gravatar 图片

javascript - 拒绝应用 {filename} 的样式,因为它的 MIME 类型 ('text/html' ) 不是受支持的样式表 MIME 类型

javascript - 使用Sproutcore 1.6实现下拉列表

javascript - 为什么在将作用域变量传递给组件绑定(bind)时,Angular 1.5 双向绑定(bind)会失败?

javascript - <脚本类型 ="x-text/handlebars"总是变成 'ember-view' 作为 div - 如何使其成为跨度?

javascript - 升级到 Angular 1.2.22 时出错