为什么拼接不从我的数组中删除元素?

Why is splice not removing elements from my array?

我正在创建一个轮盘游戏,当轮子落在特定类别上时,它会显示来自不同数组的随机项目。到目前为止,一切正常,除了当轮子落在一个类别上时,它 select 一遍又一遍地从正确的数组中选择相同的随机项目。我正在尝试使用 math.random 和 splice 方法从数组中随机 select 一个项目,然后删除该项目,以便之后只能显示数组中新的随机项目,但它没有成功了。

我不知道其余的代码是怎样的,但如果你总是一遍又一遍地得到相同的值,那可能是你没有重新运行得到值。

尝试将检索 symbolZone 的逻辑包装在一个函数中:

function getSymbolZones() {

  const symbolZones = [];

  symbolZones[1] = a[Math.floor(Math.random()*a.length)];
  symbolZones[2] = b[Math.floor(Math.random()*b.length)];
  symbolZones[3] = c[Math.floor(Math.random()*c.length)];
  symbolZones[4] = d[Math.floor(Math.random()*d.length)];
  symbolZones[5] = e[Math.floor(Math.random()*e.length)];
  symbolZones[6] = f[Math.floor(Math.random()*f.length)];
  symbolZones[7] = g[Math.floor(Math.random()*g.length)];
  symbolZones[8] = h[Math.floor(Math.random()*h.length)];

  return symbolZones;
}

然后在handleWin函数中使用。

const handleWin = (actualDeg) => {
  const symbolZones = getSymbolZones();
  const winningSymbolNr = Math.ceil(actualDeg / zoneSize);
  display.innerHTML = symbolZones[winningSymbolNr];
}

P.S. 我知道您从索引 1 开始数组,因为这是您可以从操作 45 / 45 获得的最小区域。 但如果我是你,我会从 0 开始索引,并在访问数组时减去 1:symbolZones[winningSymbolNr - 1]。 这样你就不会在尝试循环第一个索引为空的数组时遇到奇怪的错误。

除了使用 array 之外,我建议您使用 object 和 for 循环以使代码更易于执行。此代码应该有效:

let deg = 0;
// The 360 degree wheel has 8 zones, so each zone is 45 degrees
let zoneSize = 45;
let symbol = {
  a: ["a", "b", "c", "d", "e"],
  b: ["f", "g", "h", "i", "j"],
  c: ["a", "b", "c", "d", "e"],
  d: ["f", "g", "h", "i", "j"],
  e: ["a", "b", "c", "d", "e"],
  f: ["f", "g", "h", "i", "j"],
  g: ["a", "b", "c", "d", "e"],
  h: ["f", "g", "h", "i", "j"],
}

// zones for each 8 categories
let ran = Math.floor(Math.random() * Object.keys(symbol).length)
console.log(Object.values(symbol)[ran])
//Random select a zone from above 8 
let selectedzone = Object.values(symbol)[ran]
//Random select an item from selected zone
let index = Math.floor(Math.random() * selectedzone.length)
let symbolZones = selectedzone[index]
console.log(symbolZones)
const handleWin = (actualDeg) => {
  const winningSymbolNr = Math.ceil(actualDeg / zoneSize);
  display.innerHTML = symbolZones[winningSymbolNr];
}

我将输入数组重新排列为一个数组数组(5 个包含 9 个元素的数组 = 45)。我猜你想把整个事情洗牌。

const log = data => console.log(JSON.stringify(data));

let zones = [
  ["", "", "", "", "", "", "", "", ""],
  ["", "", "", "", "", "", "", "", ""],
  ["", "", "", "", "", "", "", "", ""],
  ["", "", "", "", "", "", "", "", ""],
  ["", "", "", "", "", "", "", "", ""]
];
let zoneSize = zones.length * zones[0].length;
let symbolZones = [];

for (let i = zoneSize; i > 0; i--) {
  let deg = zones.flatMap(z => z.splice(Math.floor(Math.random() * z.length), 1));
  if(deg.length > 0) {
    symbolZones.push(deg);
  }
}
log(`Original Array zones`);
log(zones);
log(`New Array symbolZones`);
log(symbolZones);
.as-console-row-code {
  display: block;
  width: 100%;
  overflow-wrap: anywhere;
}

.as-console-row::after {
  content: ''!important
}