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

标签 javascript arrays underscore.js shuffle

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

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/

相关文章:

javascript - 从字符串(包含字符串)创建数组的javascript数组

javascript - 滚动条有效时如何完整显示下拉菜单内容?

javascript - 滚动条未出现在弹出窗口中

javascript - 基于并集和交集合并两个 json 数组对象

javascript - 如何安装 underscore.js?

javascript - 如何在手动调整一列宽度后调整 Angular ui-grid 剩余列的大小?

php - 如何将每个选中的复选框添加到 MySQL 中的单行

C 将 argv[] 中的字符串分配给 char 数组

sorting - 在 awk 中对关联数组进行排序

javascript - 加载模板时出现异常。下划线/ Backbone