js一些小想法

86 阅读1分钟
  1. 数组去重还可以这样做,跟一个面试官聊天,给我提供的思路,原理是indexOf返回从左到右的第一个元素的下标,那么和它的index如果一样,证明就对了,其他不对的过滤掉就可以,一次循环结束战斗
let a = [1,2,2,5,5,3,23,1,5]
let b = a.filter((item,index)=>a.indexOf(item)===index)
  1. 也是和面试官聊的,说给我一个播放器,里面15首歌,每次切换歌的顺序都不一样,每个位置都不在原来的位置上,问我如何实现(我个人对这些题感兴趣,但当时环境有些紧张没说上来,回来后想了想写了出来,还是值得纪念的)
function getRandomList(arr) {
  let res = [];
  let exists = [];
  while (res.length !== arr.length) {
    // 先来一个简易深拷贝
    let narr = JSON.parse(JSON.stringify(arr));
    // 只有在当前下标没在存在列表里才放进去,不然循环的时候有重复值
    let flag = exists.indexOf(res.length) === -1
    if (flag)
      exists.push(res.length);
    // 刨除当前位置,其他任意位置取一个放进来
    narr = narr.filter((_, i) => exists.indexOf(i) === -1)
    if (flag)
      exists.pop()
    let index = Math.floor(narr.length * Math.random());
    exists.push(arr.indexOf(narr[index]));
    res.push(narr[index]);
  }
  // 特殊判断,如果最后一个等于最后一个的值,那就随便和前边的交换一下位置
  let val = res[res.length-1]
  if (!val) {
    res.pop()
    let tmp = res.pop()
    res.push(arr.pop())
    res.push(tmp)
  }
  return res;
}
let r = getRandomList([
  "七里香",
  "new boy",
  "稻香",
  "说好不哭",
  "你是我的眼",
  "星爵",
]);
console.log(r);