首页 > 解决方案 > 如何在递归之前从数组中删除某个元素?

问题描述

所以我正在尝试制作一个基本的炸弹线切割游戏,您可以从 6 种可能颜色的数组中随机选择 4 种颜色,但我无法获得它,因此 4 种随机颜色中没有重复的颜色。我不确定如何从数组中删除已经选择的颜色。我认为我的逻辑是错误的。

const colors = ['Blue', 'Red', 'Yellow', 'White', 'Black', 'Green']
function getXRandomColors(colors, x, result) {
    if (x === 0) return result
    const randomIndex = Math.floor(Math.random() * colors.length)
    if (colors.includes(randomIndex)){
        colors = colors.filter(color => color !== randomIndex)}
    return getXRandomColors(colors, x - 1, [...result, colors[randomIndex]])
}
var fourRandomColors = getXRandomColors(colors, 4, [])
console.log('The wires are: ' + fourRandomColors);

标签: javascript

解决方案


我将创建一个临时变量设置为选择的颜色,然后randomIndex在继续递归之前删除该数组条目。

const colors = ['Blue', 'Red', 'Yellow', 'White', 'Black', 'Green']
function getXRandomColors(colors, x, result) {
    if (x === 0) return result
    const randomIndex = Math.floor(Math.random() * colors.length)
    let pickedColor = colors[randomIndex];
    colors.splice(randomIndex, 1);
    return getXRandomColors(colors, x - 1, [...result, pickedColor])
}
var fourRandomColors = getXRandomColors(colors, 4, [])
console.log('The wires are: ' + fourRandomColors);

这样你就可以保证不会有任何重复。

在您当前的示例中出现了几个问题:

在您的过滤器功能中

    colors = colors.filter(color => color !== randomIndex)}

条件 ( color !== randomIndex) 将始终为真,因为随机索引是一个数字,而颜色是一个字符串。如果您比较索引,您想要做的是;

    colors = colors.filter((color, index) => index !== randomIndex)}

但即使这样也不会产生预期的结果,因为您要从数组中删除随机索引而不将其存储在某处,这就是重复项首先出现的方式。


推荐阅读