gpt4 book ai didi

javascript - 如何打乱 Javascript 数组以确保每个索引都位于新数组中的新位置?

转载 作者:可可西里 更新时间:2023-11-01 02:10:31 32 4
gpt4 key购买 nike

我有一个对象数组,就像这样。

var usersGoing = [
{ user: 0 },
{ user: 1 },
{ user: 2 },
{ user: 3 },
{ user: 4 }
];

我需要打乱这个数组,以便没有对象保留在与实例化时相同的索引中,如下所示:

[
{ user: 3 },
{ user: 2 },
{ user: 4 },
{ user: 0 },
{ user: 1 }
]

必须以这种方式对结果数组进行排序,因为这些用户对象中的每一个都将分配给不同的用户对象。

我尝试了几种不同的排序算法,包括 Fisher-Yates,我也尝试过使用 Underscore.js 的 _.shuffle() 和 Kirupa 的这个变体 Shuffling an Array in JavaScript :

function shuffleFY(input) {
for (var i = input.length-1; i >=0; i--) {
var randomIndex = Math.floor(Math.random()*(i+1));
var itemAtIndex = input[randomIndex];

input[randomIndex] = input[i];
input[i] = itemAtIndex;
}
return input;
}

我试过的都没有用。帮忙?

更新:我在下面将答案标记为正确,因为正确遵循了 Sattolo Cycle 的关键点。此外,这不是 Shuffles Random Numbers with no repetition in Javascript/PHP 的副本因为这个问题对结果数组有额外的要求,不仅不包含重复项,而且不能在相同的初始索引位置包含项目。

最佳答案

您在 Python 中发布了 Sattolo 算法的链接:

from random import randrange

def sattoloCycle(items):
i = len(items)
while i > 1:
i = i - 1
j = randrange(i) # 0 <= j <= i-1
items[j], items[i] = items[i], items[j]
return

这里它被翻译成 JavaScript:

function sattoloCycle(items) {
for(var i = items.length; i-- > 1; ) {
var j = Math.floor(Math.random() * i);
var tmp = items[i];
items[i] = items[j];
items[j] = tmp;
}
}

关于javascript - 如何打乱 Javascript 数组以确保每个索引都位于新数组中的新位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33604137/

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