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);
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)
这可能不是洗牌数组的最有效方法,但扫雷板太小了,这无关紧要。
我正在尝试制作扫雷器,但发生了一些奇怪的事情,在 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);
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)
这可能不是洗牌数组的最有效方法,但扫雷板太小了,这无关紧要。