【发布时间】:2016-02-09 19:18:27
【问题描述】:
我有一个对象数组,就像这样。
var usersGoing = [
{ user: 0 },
{ user: 1 },
{ user: 2 },
{ user: 3 },
{ user: 4 }
];
我需要对这个 Array 进行洗牌,以便没有 Object 保留在与实例化时相同的索引中,如下所示:
[
{ 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 循环的关键点。此外,这不是 Shuffles Random Numbers with no repetition in Javascript/PHP 的重复,因为这个问题对结果数组有额外的要求,不仅不包含重复项,而且不能在相同的初始索引位置包含项目。
【问题讨论】:
-
我相信我正在寻找的是一个代表 The Sattolo Cycle seen here 的 Javascript 函数。 THere's an example in Python there,但我对Python一无所知,不知道语法。
-
将 Fisher-Yates-Durstenfeld-Knuth 转换为 Sattolo 就像将
Math.random()*(i+1)更改为Math.random()*(i)一样简单
标签: javascript arrays underscore.js shuffle