gpt4 book ai didi

javascript - 如何从对象中选取随机属性而不在多次调用后重复?

转载 作者:行者123 更新时间:2023-12-03 12:02:30 24 4
gpt4 key购买 nike

我正在尝试从包含胶片对象的对象中随机挑选一部胶片。我需要能够重复调用该函数以获得不同的结果,直到使用完每部电影为止。

我有这个函数,但它不起作用,因为即使内部函数调用自身,外部函数也不会返回任何内容,因为结果不唯一。

var watchedFilms = [];
$scope.watchedFilms = watchedFilms;

var getRandomFilm = function(movies) {
var moviesLength = Object.keys(movies).length;

function doPick() {
var pick = pickRandomProperty(movies);
var distinct = true;
for (var i = 0;i < watchedFilms.length; i += 1) {
if (watchedFilms[i]===pick.title) {
distinct = false;
if (watchedFilms.length === moviesLength) {
watchedFilms = [];
}
}
}

if (distinct === true) {
watchedFilms.push(pick.title);
return pick;
}

if (distinct === false) {
console.log(pick.title+' has already been picked');
doPick();
}
};
return doPick();
}

最佳答案

T.J. Crowder 已经给出了一个很好的答案,但是我想展示使用 OO 解决问题的另一种方法。

您可以创建一个对象来包装数组并确保每次都返回随机未使用的项目。我创建的版本是循环的,这意味着它无限循环整个集合,但如果您想停止循环,您可以跟踪选择了多少部电影,并在达到电影总数后停止。

function CyclicRandomIterator(list) {
this.list = list;
this.usedIndexes = {};
this.displayedCount = 0;
}

CyclicRandomIterator.prototype.next = function () {
var len = this.list.length,
usedIndexes = this.usedIndexes,
lastBatchIndex = this.lastBatchIndex,
denyLastBatchIndex = this.displayedCount !== len - 1,
index;

if (this.displayedCount === len) {
lastBatchIndex = this.lastBatchIndex = this.lastIndex;
usedIndexes = this.usedIndexes = {};
this.displayedCount = 0;
}

do index = Math.floor(Math.random() * len);
while (usedIndexes[index] || (lastBatchIndex === index && denyLastBatchIndex));

this.displayedCount++;
usedIndexes[this.lastIndex = index] = true;

return this.list[index];
};

然后你可以简单地执行以下操作:

var randomMovies = new CyclicRandomIterator(Object.keys(movies));

var randomMovie = movies[randomMovies.next()];

请注意,如果您循环遍历项目,我的实现的优点是同一项目永远不会连续返回两次,即使在新循环开始时也是如此。

关于javascript - 如何从对象中选取随机属性而不在多次调用后重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25350625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com