Firefox 和 Google Chrome 使用 .sort(() => Math.random() - 0.5) 创建或排序数组的区别

Firefox and Google Chrome differences creating or sorting an array using .sort(() => Math.random() - 0.5);

我正在尝试制作扫雷器,但发生了一些奇怪的事情,在 Chrome 或基于 Chromium 的导航器中,一切似乎都很好,但在 firefox 中,所有生成的炸弹都聚集在一起数组的末尾或开头在 sort() 如何处理参数方面有什么不同吗?

我会留下生成板的代码。

  

    function createBoard() {
        //create an array with shuffled bombs
        const bombsArray = Array(bombAmount).fill("bomb");
        const emptyArray = Array(width * width - bombAmount).fill("valid");
        const gameArray = emptyArray.concat(bombsArray);
        const shuffledArray = gameArray.sort(() => Math.random() - 0.5);
        for (let i = 0; i < width * width; i++) {
          const square = document.createElement("div");
          square.setAttribute("id", i);
          square.classList.add(shuffledArray[i])
          grid.appendChild(square);
          squares.push(square);

来自the documentation

Note: compareFunction(a, b) must always return the same value when given a specific pair of elements a and b as its two arguments.

在你的情况下,你不这样做,这会产生未定义的行为,很可能取决于浏览器的 Array.sort 实现所使用的排序算法。

您可以确保特定数组项的随机值保持稳定,方法是使用随机 order 属性 映射到新数组,排序,然后再次映射回来:

const shuffledArray = gameArray
  .map((value) => ({ value, order: Math.random() }))
  .sort((a, b) => a.order - b.order)
  .map(({ value }) => value)

这可能不是洗牌数组的最有效方法,但扫雷板太小了,这无关紧要。