从数组获取非重复索引在 0 时失败

Get non-repeating index from array fails on 0

本文关键字:失败 索引 数组 获取      更新时间:2023-09-26

我有以下函数,它从数组中返回一个随机的非重复索引,不断将它们拉出,直到全部使用完毕,然后重置自身并开始重用它们。

它还确保最后一个拉出的索引

与重置时拉出的下一个索引不同,这样您就不会连续出现相同的索引。

var listIndexes = [];
var lastIndex;
function getRandomIndex(indexes)
{
    if (!listIndexes.length) {
        for (var i = 0; i < indexes; i++) {
            listIndexes.push(i);
        }
    }
    var randomIndex = Math.floor(Math.random() * listIndexes.length);
    var uniqueIndex = listIndexes[randomIndex];
    listIndexes.splice(randomIndex, 1);
    if(lastIndex && uniqueIndex == lastIndex)
  {
    listIndexes = [];
    return getRandomIndex(indexes);
  }
  lastIndex = uniqueIndex;
  return uniqueIndex;
}
var index = getRandomIndex(5);
console.log(index);

但是,我发现如果lastIndexuniqueIndex0,那么它会返回它,所以我得到索引0连续返回(无论重置如何),这破坏了条件的要点来防止这种情况。

为什么会这样?打破逻辑的0有什么特别之处?

lastIndex && uniqueIndex == lastIndex对于

0来说是假的(参见MDN:Falsy了解更多细节)。

给定的方程对于00 && true的,这将导致0

您很可能应该改用lastIndex !== undefined && uniqueIndex == lastIndex。因为这样你就会严格比较lastIndex是设置的还是仍然undefined

尝试执行以下操作

...
var lastIndex = -1; 
....
if(lastIndex>-1 && uniqueIndex == lastIndex)

希望对您有所帮助

我对javascript了解不多。也许您对拼接方法有一些问题。https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/splice

它说它是这样使用的:list = list.slice(...);也许另一个答案也是答案的一部分。没有SE,祝你好运;)