为什么拼接不从我的数组中删除元素?
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
}
我正在创建一个轮盘游戏,当轮子落在特定类别上时,它会显示来自不同数组的随机项目。到目前为止,一切正常,除了当轮子落在一个类别上时,它 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
}