Comment randomiser l'ordre d'un tableau ?
P粉512526720
P粉512526720 2023-10-11 18:42:00
0
2
592

Je souhaite mélanger un tableau d'éléments en JavaScript comme ceci :

[0, 3, 3] -> [3, 0, 3]
[9, 3, 6, 0, 6] -> [0, 3, 6, 9, 6]
[3, 3, 6, 0, 6] -> [0, 3, 6, 3, 6]


P粉512526720
P粉512526720

répondre à tous(2)
P粉590428357

Vous pouvez utiliser le Fisher-Yates Shuffle (code adapté de ce site) :

function shuffle(array) {
    let counter = array.length;

    // While there are elements in the array
    while (counter > 0) {
        // Pick a random index
        let index = Math.floor(Math.random() * counter);

        // Decrease counter by 1
        counter--;

        // And swap the last element with it
        let temp = array[counter];
        array[counter] = array[index];
        array[index] = temp;
    }

    return array;
}
P粉316110779

Utilise une version moderne de l'algorithme de lecture aléatoire Fisher-Yates  :

/**
 * Shuffles array in place.
 * @param {Array} a items An array containing the items.
 */
function shuffle(a) {
    var j, x, i;
    for (i = a.length - 1; i > 0; i--) {
        j = Math.floor(Math.random() * (i + 1));
        x = a[i];
        a[i] = a[j];
        a[j] = x;
    }
    return a;
}

Version ES2015 (ES6)

/**
 * Shuffles array in place. ES6 version
 * @param {Array} a items An array containing the items.
 */
function shuffle(a) {
    for (let i = a.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [a[i], a[j]] = [a[j], a[i]];
    }
    return a;
}

Mais sachez que l'utilisation de déstructurations de variables d'échange à partir d'octobre 2017, l'allocation entraînera de sévères pénalités de performances.

Utilisation

var myArray = ['1','2','3','4','5','6','7','8','9'];
shuffle(myArray);

Mettre en œuvre le prototype

En utilisant Object.defineProperty (Tiré de cette réponse SO Object.defineProperty取自此SO答案的方法)我们还可以实现该函数作为数组的原型方法,而无需让它出现在诸如 for (i in arr) 之类的循环中。以下代码将允许您调用 arr.shuffle() 来随机排列数组 arr), nous pouvons également implémenter la fonction en tant que prototype de tableau méthode sans qu'elle apparaisse dans une boucle telle que for (i in arr). Le code suivant vous permettra de mélanger un tableau arr en appelant arr.shuffle() :

Object.defineProperty(Array.prototype, 'shuffle', {
    value: function() {
        for (let i = this.length - 1; i > 0; i--) {
            const j = Math.floor(Math.random() * (i + 1));
            [this[i], this[j]] = [this[j], this[i]];
        }
        return this;
    }
});
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal